textmode.js 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/textmode.esm.js +965 -965
  2. package/dist/textmode.umd.js +13 -13
  3. package/dist/types/Textmode.d.ts +133 -0
  4. package/dist/types/errors/Error.d.ts +24 -0
  5. package/dist/types/errors/ErrorHandler.d.ts +77 -0
  6. package/dist/types/errors/index.d.ts +2 -0
  7. package/dist/types/exports/conversion.d.ts +1 -0
  8. package/dist/types/exports/filters.d.ts +1 -0
  9. package/dist/types/exports/input.d.ts +1 -0
  10. package/dist/types/exports/layering.d.ts +1 -0
  11. package/dist/types/exports/loadables.d.ts +1 -0
  12. package/dist/types/exports/loading.d.ts +1 -0
  13. package/dist/types/exports/plugins.d.ts +1 -0
  14. package/dist/types/index.d.ts +85 -0
  15. package/dist/types/rendering/index.d.ts +4 -0
  16. package/dist/types/rendering/webgl/batching/DrawQueue.d.ts +89 -0
  17. package/dist/types/rendering/webgl/batching/GeometryAttributeCache.d.ts +18 -0
  18. package/dist/types/rendering/webgl/batching/InstanceAttributeBinder.d.ts +83 -0
  19. package/dist/types/rendering/webgl/batching/InstanceBatch.d.ts +87 -0
  20. package/dist/types/rendering/webgl/batching/InstanceBuffer.d.ts +68 -0
  21. package/dist/types/rendering/webgl/batching/InstanceData.d.ts +56 -0
  22. package/dist/types/rendering/webgl/batching/InstanceWriter.d.ts +78 -0
  23. package/dist/types/rendering/webgl/core/Framebuffer.d.ts +94 -0
  24. package/dist/types/rendering/webgl/core/Renderer.d.ts +78 -0
  25. package/dist/types/rendering/webgl/core/Shader.d.ts +62 -0
  26. package/dist/types/rendering/webgl/core/interfaces/IFramebuffer.d.ts +101 -0
  27. package/dist/types/rendering/webgl/core/interfaces/IRenderer.d.ts +214 -0
  28. package/dist/types/rendering/webgl/geometries/2d/Arc.d.ts +17 -0
  29. package/dist/types/rendering/webgl/geometries/2d/BezierCurve.d.ts +23 -0
  30. package/dist/types/rendering/webgl/geometries/2d/Ellipse.d.ts +21 -0
  31. package/dist/types/rendering/webgl/geometries/2d/Line.d.ts +21 -0
  32. package/dist/types/rendering/webgl/geometries/2d/Rectangle.d.ts +21 -0
  33. package/dist/types/rendering/webgl/geometries/2d/Triangle.d.ts +21 -0
  34. package/dist/types/rendering/webgl/geometries/BaseGeometry.d.ts +57 -0
  35. package/dist/types/rendering/webgl/geometries/immediate/ImmediateQuad.d.ts +33 -0
  36. package/dist/types/rendering/webgl/geometries/index.d.ts +6 -0
  37. package/dist/types/rendering/webgl/geometries/utils/GeometryDescriptors.d.ts +31 -0
  38. package/dist/types/rendering/webgl/geometries/utils/GeometryGenerator.d.ts +16 -0
  39. package/dist/types/rendering/webgl/index.d.ts +19 -0
  40. package/dist/types/rendering/webgl/materials/Material.d.ts +23 -0
  41. package/dist/types/rendering/webgl/materials/MaterialManager.d.ts +56 -0
  42. package/dist/types/rendering/webgl/materials/index.d.ts +2 -0
  43. package/dist/types/rendering/webgl/pipeline/MaterialBatchPipeline.d.ts +54 -0
  44. package/dist/types/rendering/webgl/pipeline/index.d.ts +7 -0
  45. package/dist/types/rendering/webgl/state/RenderState.d.ts +159 -0
  46. package/dist/types/rendering/webgl/types/DrawCommand.d.ts +29 -0
  47. package/dist/types/rendering/webgl/types/GeometryTypes.d.ts +147 -0
  48. package/dist/types/rendering/webgl/types/RenderTypes.d.ts +18 -0
  49. package/dist/types/rendering/webgl/types/UniformTypes.d.ts +11 -0
  50. package/dist/types/rendering/webgl/utils/GLUtils.d.ts +68 -0
  51. package/dist/types/rendering/webgl/utils/ViewportCache.d.ts +3 -0
  52. package/dist/types/rendering/webgl/utils/hash.d.ts +102 -0
  53. package/dist/types/textmode/AnimationController.d.ts +110 -0
  54. package/dist/types/textmode/Canvas.d.ts +58 -0
  55. package/dist/types/textmode/Grid.d.ts +563 -0
  56. package/dist/types/textmode/TextmodeColor.d.ts +405 -0
  57. package/dist/types/textmode/Textmodifier.d.ts +113 -0
  58. package/dist/types/textmode/conversion/ConversionManager.d.ts +89 -0
  59. package/dist/types/textmode/conversion/ConversionRegistry.d.ts +78 -0
  60. package/dist/types/textmode/conversion/index.d.ts +2 -0
  61. package/dist/types/textmode/conversion/strategies/brightness.d.ts +2 -0
  62. package/dist/types/textmode/filters/FilterManager.d.ts +132 -0
  63. package/dist/types/textmode/filters/index.d.ts +2 -0
  64. package/dist/types/textmode/filters/types.d.ts +78 -0
  65. package/dist/types/textmode/interfaces/IDisposable.d.ts +14 -0
  66. package/dist/types/textmode/interfaces/ITextmodifier.d.ts +753 -0
  67. package/dist/types/textmode/interfaces/index.d.ts +2 -0
  68. package/dist/types/textmode/layers/Layer2DCompositor.d.ts +89 -0
  69. package/dist/types/textmode/layers/LayerManager.d.ts +115 -0
  70. package/dist/types/textmode/layers/TextmodeLayer.d.ts +105 -0
  71. package/dist/types/textmode/layers/index.d.ts +4 -0
  72. package/dist/types/textmode/layers/interfaces/ILayerManager.d.ts +158 -0
  73. package/dist/types/textmode/layers/interfaces/ITextmodeLayer.d.ts +821 -0
  74. package/dist/types/textmode/layers/types.d.ts +78 -0
  75. package/dist/types/textmode/loadables/ITextmodeSource.d.ts +541 -0
  76. package/dist/types/textmode/loadables/TextmodeImage.d.ts +45 -0
  77. package/dist/types/textmode/loadables/TextmodeSource.d.ts +65 -0
  78. package/dist/types/textmode/loadables/TextmodeTexture.d.ts +95 -0
  79. package/dist/types/textmode/loadables/font/CharacterColorMapper.d.ts +34 -0
  80. package/dist/types/textmode/loadables/font/CharacterExtractor.d.ts +22 -0
  81. package/dist/types/textmode/loadables/font/MetricsCalculator.d.ts +23 -0
  82. package/dist/types/textmode/loadables/font/TextmodeFont.d.ts +176 -0
  83. package/dist/types/textmode/loadables/font/TextureAtlas.d.ts +66 -0
  84. package/dist/types/textmode/loadables/font/index.d.ts +8 -0
  85. package/dist/types/textmode/loadables/font/types.d.ts +28 -0
  86. package/dist/types/textmode/loadables/font/typr/Typr.d.ts +20 -0
  87. package/dist/types/textmode/loadables/font/typr/types.d.ts +241 -0
  88. package/dist/types/textmode/loadables/font/utils/CmapUtils.d.ts +11 -0
  89. package/dist/types/textmode/loadables/font/utils/FontTableReader.d.ts +40 -0
  90. package/dist/types/textmode/loadables/font/utils/index.d.ts +7 -0
  91. package/dist/types/textmode/loadables/index.d.ts +6 -0
  92. package/dist/types/textmode/loadables/video/ITextmodeVideo.d.ts +339 -0
  93. package/dist/types/textmode/loadables/video/TextmodeVideo.d.ts +81 -0
  94. package/dist/types/textmode/loading/LoadingPhase.d.ts +28 -0
  95. package/dist/types/textmode/loading/LoadingPhaseTracker.d.ts +20 -0
  96. package/dist/types/textmode/loading/LoadingScreenManager.d.ts +208 -0
  97. package/dist/types/textmode/loading/LoadingScreenState.d.ts +22 -0
  98. package/dist/types/textmode/loading/LoadingScreenTheme.d.ts +26 -0
  99. package/dist/types/textmode/loading/LoadingScreenTransition.d.ts +17 -0
  100. package/dist/types/textmode/loading/index.d.ts +7 -0
  101. package/dist/types/textmode/loading/templates/SpinnerTemplate.d.ts +2 -0
  102. package/dist/types/textmode/loading/templates/index.d.ts +1 -0
  103. package/dist/types/textmode/loading/types.d.ts +255 -0
  104. package/dist/types/textmode/managers/KeyboardManager.d.ts +128 -0
  105. package/dist/types/textmode/managers/MouseManager.d.ts +159 -0
  106. package/dist/types/textmode/managers/PluginManager.d.ts +220 -0
  107. package/dist/types/textmode/managers/TouchManager.d.ts +237 -0
  108. package/dist/types/textmode/managers/index.d.ts +12 -0
  109. package/dist/types/textmode/mixins/AnimationMixin.d.ts +8 -0
  110. package/dist/types/textmode/mixins/KeyboardMixin.d.ts +13 -0
  111. package/dist/types/textmode/mixins/MouseMixin.d.ts +10 -0
  112. package/dist/types/textmode/mixins/RenderingMixin.d.ts +8 -0
  113. package/dist/types/textmode/mixins/TextmodifierMixin.d.ts +19 -0
  114. package/dist/types/textmode/mixins/TouchMixin.d.ts +6 -0
  115. package/dist/types/textmode/mixins/index.d.ts +9 -0
  116. package/dist/types/textmode/mixins/interfaces/IAnimationMixin.d.ts +674 -0
  117. package/dist/types/textmode/mixins/interfaces/IKeyboardMixin.d.ts +234 -0
  118. package/dist/types/textmode/mixins/interfaces/IMouseMixin.d.ts +425 -0
  119. package/dist/types/textmode/mixins/interfaces/IRenderingMixin.d.ts +2147 -0
  120. package/dist/types/textmode/mixins/interfaces/ITouchMixin.d.ts +509 -0
  121. package/dist/types/textmode/types.d.ts +52 -0
  122. package/dist/types/utils/Disposable.d.ts +18 -0
  123. package/dist/types/utils/TextmodeCollection.d.ts +172 -0
  124. package/dist/types/utils/array.d.ts +34 -0
  125. package/dist/types/utils/color.d.ts +61 -0
  126. package/dist/types/utils/input.d.ts +11 -0
  127. package/dist/types/utils/math.d.ts +118 -0
  128. package/dist/types/utils/shader.d.ts +12 -0
  129. package/package.json +2 -2
@@ -1,19 +1,19 @@
1
- (function(E,T){typeof exports=="object"&&typeof module<"u"?T(exports):typeof define=="function"&&define.amd?define(["exports"],T):T((E=typeof globalThis<"u"?globalThis:E||self).textmode={})})(this,function(E){"use strict";var fi=Object.defineProperty;var di=(E,T,N)=>T in E?fi(E,T,{enumerable:!0,configurable:!0,writable:!0,value:N}):E[T]=N;var o=(E,T,N)=>di(E,typeof T!="symbol"?T+"":T,N);class T extends Error{constructor(t,e){super(T.i(t,e)),this.name="TextmodeError"}static i(t,e){return`${t}${e&&Object.keys(e).length>0?`
1
+ (function(E,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):R((E=typeof globalThis<"u"?globalThis:E||self).textmode={})})(this,function(E){"use strict";var fi=Object.defineProperty;var di=(E,R,_)=>R in E?fi(E,R,{enumerable:!0,configurable:!0,writable:!0,value:_}):E[R]=_;var o=(E,R,_)=>di(E,typeof R!="symbol"?R+"":R,_);class R extends Error{constructor(t,e){super(R.i(t,e)),this.name="TextmodeError"}static i(t,e){return`${t}${e&&Object.keys(e).length>0?`
2
2
 
3
3
  📋 Context:${Object.entries(e).map(([i,s])=>`
4
- - ${i}: ${T.h(s)}`).join("")}`:""}
4
+ - ${i}: ${R.h(s)}`).join("")}`:""}
5
5
 
6
6
  ${"↓".repeat(24)}
7
- `}static h(t){if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string")return`"${t}"`;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.length===0?"[]":t.length<=5?`[${t.map(e=>T.h(e)).join(", ")}]`:`[${t.slice(0,3).map(e=>T.h(e)).join(", ")}, ... +${t.length-3} more]`;if(typeof t=="object"){const e=Object.keys(t);return e.length===0?"{}":e.length<=3?`{ ${e.map(i=>`${i}: ${T.h(t[i])}`).join(", ")} }`:`{ ${e.slice(0,2).map(i=>`${i}: ${T.h(t[i])}`).join(", ")}, ... +${e.length-2} more }`}return String(t)}}var N=(n=>(n[n.SILENT=0]="SILENT",n[n.WARNING=1]="WARNING",n[n.ERROR=2]="ERROR",n[n.THROW=3]="THROW",n))(N||{});const Y=class Y{constructor(){o(this,"l",{globalLevel:3})}static u(){return Y.o||(Y.o=new Y),Y.o}v(t,e){const i="%c[textmode.js] Oops! (╯°□°)╯︵ Something went wrong in your code.",s="color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;";switch(this.l.globalLevel){case 0:return!1;case 1:return console.group(i,s),console.warn(T.i(t,e)),console.groupEnd(),!1;case 2:return console.group(i,s),console.error(T.i(t,e)),console.groupEnd(),!1;default:throw new T(t,e)}}m(t,e,i){return!!t||(this.v(e,i),!1)}_(t){this.l.globalLevel=t}};o(Y,"o",null);let mt=Y;const vt=mt.u();class q{constructor(){o(this,"A",new Set)}C(t){this.A.add(t)}dispose(){for(const t of this.A)t();this.A.clear()}}function B(n){return n*(Math.PI/180)}function J(n){return n*(180/Math.PI)}function Ft(n,t,e,i){return J(Math.atan2(i-t,e-n))}function tt(n,t,e,i){return Math.hypot(e-n,i-t)}function L(n,t,e){return Math.min(Math.max(n,t),e)}function Mt(n){return(n%360+360)%360/360}function Ct(n,t){n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,t)}function et(n,t,e){n.bindTexture(n.TEXTURE_2D,t),Ct(n,e),n.bindTexture(n.TEXTURE_2D,null)}function At(n,t,e=n.NEAREST,i=n.NEAREST,s=n.CLAMP_TO_EDGE,r=n.CLAMP_TO_EDGE){const h=n.createTexture();return n.bindTexture(n.TEXTURE_2D,h),St(n,e,i,s,r),Ct(n,t),n.bindTexture(n.TEXTURE_2D,null),h}function St(n,t,e,i,s){n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,t),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,e),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,i),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,s)}function j(n,t,e,i,s,r=0,h=WebGL2RenderingContext.FLOAT,a=!1){n.enableVertexAttribArray(t),n.vertexAttribPointer(t,e,h,a,i,s),n.vertexAttribDivisor(t,r)}function Pt(n,t,e,i,s){n.bindBuffer(t,e),n.bufferData(t,i,s),n.bindBuffer(t,null)}function yt(n){let t=0,e=0;return n instanceof HTMLVideoElement?(t=n.videoWidth,e=n.videoHeight):n instanceof HTMLImageElement?(t=n.naturalWidth,e=n.naturalHeight):n instanceof HTMLCanvasElement&&(t=n.width,e=n.height),{width:t,height:e}}class it extends q{constructor(e,i,s=i,r=1,h={},a){super();o(this,"M");o(this,"F");o(this,"l");o(this,"$");o(this,"P");o(this,"S",[]);o(this,"U",null);o(this,"k");o(this,"R");o(this,"D",null);o(this,"L",new Map);this.M=i,this.F=s,this.$=e,this.k=L(r,1,8),this.R=a,this.l={filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte",depth:!0,...h};const l=e.getParameter(e.MAX_DRAW_BUFFERS),u=e.getParameter(e.MAX_COLOR_ATTACHMENTS);this.k=Math.min(this.k,l,u),this.P=e.createFramebuffer(),this.O(),this.H(),this.l.depth&&this.I()}O(){const e=this.$,i=this.l.filter==="linear"?e.LINEAR:e.NEAREST,s=this.l.wrap==="repeat"?e.REPEAT:e.CLAMP_TO_EDGE;for(let r=0;r<this.k;r++){const h=e.createTexture();e.bindTexture(e.TEXTURE_2D,h),St(e,i,i,s,s),this.G(h,!1),this.S.push(h)}e.bindTexture(e.TEXTURE_2D,null)}G(e,i=!0){const s=this.$,r=this.l.type==="float"?s.FLOAT:s.UNSIGNED_BYTE,h=r===s.FLOAT?s.RGBA32F:s.RGBA8,a=s.RGBA;i&&s.bindTexture(s.TEXTURE_2D,e),s.texImage2D(s.TEXTURE_2D,0,h,this.M,this.F,0,a,r,null)}H(){const e=this.$;if(e.bindFramebuffer(e.FRAMEBUFFER,this.P),this.k===1)e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.S[0],0);else{const i=[];for(let s=0;s<this.k;s++){const r=e.COLOR_ATTACHMENT0+s;e.framebufferTexture2D(e.FRAMEBUFFER,r,e.TEXTURE_2D,this.S[s],0),i.push(r)}e.drawBuffers(i)}e.bindFramebuffer(e.FRAMEBUFFER,null)}I(){const e=this.$;this.U=e.createRenderbuffer(),this.N(),e.bindFramebuffer(e.FRAMEBUFFER,this.P),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,this.U),e.bindFramebuffer(e.FRAMEBUFFER,null)}N(){if(!this.U)return;const e=this.$;e.bindRenderbuffer(e.RENDERBUFFER,this.U),e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT24,this.M,this.F),e.bindRenderbuffer(e.RENDERBUFFER,null)}j(e){et(this.$,this.S[0],e)}resize(e,i){this.M=e,this.F=i,this.L.clear();const s=this.$;for(const r of this.S)this.G(r,!0);s.bindTexture(s.TEXTURE_2D,null),this.N(),this.D=null}readPixels(e){const i=this.L.get(e);if(i)return i;const s=this.$,r=this.M,h=this.F,a=new Uint8Array(r*h*4),l=s.getParameter(s.READ_FRAMEBUFFER_BINDING);s.bindFramebuffer(s.READ_FRAMEBUFFER,this.P),s.readBuffer(s.COLOR_ATTACHMENT0+e),s.readPixels(0,0,r,h,s.RGBA,s.UNSIGNED_BYTE,a),s.bindFramebuffer(s.READ_FRAMEBUFFER,l);const u=4*r,c=new Uint8Array(a.length);for(let f=0;f<h;f++){const g=(h-1-f)*u,p=f*u;c.set(a.subarray(g,g+u),p)}return this.L.set(e,c),c}begin(){const e=this.$;this.L.clear(),this.R.X(),this.R.Y(this.P,this.M,this.F,this.k),this.l.depth&&e.clear(e.DEPTH_BUFFER_BIT),this.R.state.K()}end(){this.R.state.W(),this.R.Z(),this.R.q()}V(){return this.D||this.J(),this.D}J(){if(!this.R)return;const e=this.k>1,i=this.k>2,s=this.k>3,r={U6:this.S[0],U7:e?this.S[1]:this.S[0],U8:i?this.S[2]:this.S[0],U9:s?this.S[3]:this.S[0],Ua:[this.M,this.F],Ub:e,Uc:i,Ud:s},h=this.R.materialManager.tt;this.D=this.R.materialManager.st(h,r)}dispose(){const e=this.$;e.deleteFramebuffer(this.P),this.S.forEach(i=>{e.deleteTexture(i)}),this.U&&e.deleteRenderbuffer(this.U),super.dispose()}get width(){return this.M}get height(){return this.F}get framebuffer(){return this.P}get textures(){return this.S}get attachmentCount(){return this.k}}function z(n){return typeof n=="object"&&n!==null&&"textures"in n&&Array.isArray(n.textures)}function Ot(n){if(typeof n=="number"||typeof n=="boolean")return!0;if(Array.isArray(n)){if(n.length===0)return!0;const t=n[0];return typeof t=="number"||!!Array.isArray(t)}return n instanceof Float32Array||n instanceof Int32Array||!!z(n)||typeof WebGLTexture<"u"&&n instanceof WebGLTexture}class k extends q{constructor(e,i,s){super();o(this,"$");o(this,"et");o(this,"it",new Map);o(this,"rt",new Map);o(this,"nt",new Map);o(this,"ht",0);o(this,"ot",new Map);o(this,"ct");this.$=e,this.ct=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)??16,this.et=this.lt(i,s),this.ut()}ut(){const e=this.$.getProgramParameter(this.et,this.$.ACTIVE_UNIFORMS);for(let i=0;i<e;i++){const s=this.$.getActiveUniform(this.et,i);if(s){const r=s.name.replace(/\[0\]$/,""),h=this.$.getUniformLocation(this.et,r);h&&(this.it.set(r,h),this.rt.set(r,{type:s.type,size:s.size}))}}}lt(e,i){const s=this.ft(this.$.VERTEX_SHADER,e),r=this.ft(this.$.FRAGMENT_SHADER,i),h=this.$.createProgram();if(!h)throw new Error("Failed to create WebGL program");if(this.$.attachShader(h,s),this.$.attachShader(h,r),this.$.linkProgram(h),!this.$.getProgramParameter(h,this.$.LINK_STATUS)){const a=this.$.getProgramInfoLog(h);throw new Error(`Shader program link error: ${a}`)}return this.$.deleteShader(s),this.$.deleteShader(r),h}ft(e,i){const s=this.$.createShader(e);if(!s)throw new Error(`Failed to create shader of type ${e}`);if(this.$.shaderSource(s,i),this.$.compileShader(s),!this.$.getShaderParameter(s,this.$.COMPILE_STATUS)){const r=this.$.getShaderInfoLog(s);throw this.$.deleteShader(s),new Error(`Shader compilation error: ${r}`)}return s}dt(){this.$.useProgram(this.et),this.vt()}vt(){this.ht=0,this.ot.clear();for(const[e,i]of this.nt)(i instanceof WebGLTexture||z(i))&&this.nt.delete(e)}gt(e){for(const i in e)this._t(i,e[i])}_t(e,i){const s=this.it.get(e);if(!s)return;const r=this.nt.get(e);let h=!0;if(r!==void 0&&(typeof i=="number"||typeof i=="boolean"?r===i&&(h=!1):(i instanceof WebGLTexture||z(i))&&r===i&&(h=!1)),!h)return;typeof i=="number"||typeof i=="boolean"||i instanceof WebGLTexture||z(i)?this.nt.set(e,i):this.nt.delete(e);const a=this.rt.get(e);if(!a)return;const{type:l,size:u}=a,c=this.$;if(i instanceof WebGLTexture){const f=this.yt(e);return c.uniform1i(s,f),c.activeTexture(c.TEXTURE0+f),void c.bindTexture(c.TEXTURE_2D,i)}if(z(i)){const f=this.yt(e);return c.uniform1i(s,f),c.activeTexture(c.TEXTURE0+f),void c.bindTexture(c.TEXTURE_2D,i.textures[0])}if(Ot(i),typeof i!="number")if(typeof i!="boolean")if(Array.isArray(i)&&Array.isArray(i[0])){const f=i.flat();switch(l){case c.FLOAT_VEC2:c.uniform2fv(s,f);break;case c.FLOAT_VEC3:c.uniform3fv(s,f);break;case c.FLOAT_VEC4:c.uniform4fv(s,f)}}else{const f=i;switch(l){case c.FLOAT:u>1?c.uniform1fv(s,f):c.uniform1f(s,f[0]);break;case c.FLOAT_VEC2:c.uniform2fv(s,f);break;case c.FLOAT_VEC3:c.uniform3fv(s,f);break;case c.FLOAT_VEC4:c.uniform4fv(s,f);break;case c.INT:u>1?c.uniform1iv(s,f):c.uniform1i(s,f[0]);break;case c.INT_VEC2:c.uniform2iv(s,f);break;case c.INT_VEC3:c.uniform3iv(s,f);break;case c.INT_VEC4:c.uniform4iv(s,f);break;case c.BOOL:c.uniform1iv(s,f);break;case c.FLOAT_MAT2:c.uniformMatrix2fv(s,!1,f);break;case c.FLOAT_MAT3:c.uniformMatrix3fv(s,!1,f);break;case c.FLOAT_MAT4:c.uniformMatrix4fv(s,!1,f)}}else c.uniform1i(s,i?1:0);else l===c.INT||l===c.BOOL?c.uniform1i(s,i):c.uniform1f(s,i)}yt(e){const i=this.ot.get(e);if(i!==void 0)return i;if(this.ht>=this.ct)throw new Error(`[textmode.js] Shader attempted to bind more than ${this.ct} texture samplers. Uniform "${e}" cannot be assigned.`);const s=this.ht++;return this.ot.set(e,s),s}get program(){return this.et}dispose(){this.$.deleteProgram(this.et),super.dispose()}}const Ut=new WeakMap;function wt(n,t){Ut.set(n,t)}function Xt(n){return Ut.get(n)}function st(n,t,e,i,s=255){n[0]=t/255,n[1]=(e??t)/255,n[2]=(i??t)/255,n[3]=s/255}class rt{constructor(){o(this,"wt",1);o(this,"At",0);o(this,"bt",0);o(this,"Ct",0);o(this,"xt",0);o(this,"Mt",0);o(this,"Ft",0);o(this,"$t",[0,0,0]);o(this,"Pt","");o(this,"Tt",[1,1,1,1]);o(this,"St",[0,0,0,1]);o(this,"Et",!1);o(this,"kt",!1);o(this,"Rt",!1);o(this,"Dt",0);o(this,"Lt",[0,0,0,1]);o(this,"Ot",!1);o(this,"zt",[]);o(this,"Ht",[])}static Bt(){return{It:1,At:0,bt:0,Ct:0,xt:0,Mt:0,Ft:0,Dt:0,Gt:!1,Nt:!1,Rt:!1,Ot:!1,jt:[0,0,0],Qt:"",Xt:[1,1,1,1],Yt:[0,0,0,1]}}Kt(t){t.It=this.wt,t.At=this.At,t.bt=this.bt,t.Ct=this.Ct,t.xt=this.xt,t.Mt=this.Mt,t.Ft=this.Ft,t.Gt=this.Et,t.Nt=this.kt,t.Rt=this.Rt,t.Dt=this.Dt,t.Ot=this.Ot,t.jt[0]=this.$t[0],t.jt[1]=this.$t[1],t.jt[2]=this.$t[2],t.Qt=this.Pt,t.Xt[0]=this.Tt[0],t.Xt[1]=this.Tt[1],t.Xt[2]=this.Tt[2],t.Xt[3]=this.Tt[3],t.Yt[0]=this.St[0],t.Yt[1]=this.St[1],t.Yt[2]=this.St[2],t.Yt[3]=this.St[3]}Wt(t){this.wt=t.It,this.At=t.At,this.bt=t.bt,this.Ct=t.Ct,this.xt=t.xt,this.Mt=t.Mt,this.Ft=t.Ft,this.Et=t.Gt,this.kt=t.Nt,this.Rt=t.Rt,this.Dt=t.Dt,this.Ot=t.Ot,this.$t[0]=t.jt[0],this.$t[1]=t.jt[1],this.$t[2]=t.jt[2],this.Pt=t.Qt,this.Tt[0]=t.Xt[0],this.Tt[1]=t.Xt[1],this.Tt[2]=t.Xt[2],this.Tt[3]=t.Xt[3],this.St[0]=t.Yt[0],this.St[1]=t.Yt[1],this.St[2]=t.Yt[2],this.St[3]=t.Yt[3]}K(){let t=this.Ht.pop();t||(t=rt.Bt()),this.Kt(t),this.zt.push(t)}W(){const t=this.zt.pop();t?(this.Wt(t),this.Ht.push(t)):console.warn("pop() called without matching push()")}Zt(t){this.Kt(t)}qt(t){this.wt=Math.abs(t)}Vt(){this.At=0,this.bt=0,this.Ct=0,this.xt=0,this.Mt=0,this.Ft=0,this.Ot=!1}Jt(t){t!==0&&(this.xt+=B(t))}ts(t){t!==0&&(this.Mt+=B(t))}ss(t){t!==0&&(this.Ft+=B(t))}es(t=0,e=0,i=0){t===0&&e===0&&i===0||(this.At+=t,this.bt+=e,this.Ct+=i)}rs(t){this.es(t,0,0)}ns(t){this.es(0,t,0)}hs(t){this.es(0,0,t)}cs(t){this.$t[0]=t[0],this.$t[1]=t[1],this.$t[2]=t[2]}ls(t){this.Pt=t}us(t,e,i,s=255){st(this.Tt,t,e,i,s)}fs(t,e,i,s=255){st(this.St,t,e,i,s)}ds(t){this.Et=t}ps(t){this.kt=t}vs(t){this.Rt=t}gs(t){this.Dt=Mt(t)}_s(t,e,i,s){st(this.Lt,t,e,i,s)}ws(t){this.Ot=t}get canvasBackgroundColor(){return this.Lt}get charColor(){return this.Tt}get cellColor(){return this.St}get lineWeight(){return this.wt}get character(){return this.$t}get characterString(){return this.Pt}get useOrtho(){return this.Ot}get rotationX(){return this.xt}get rotationY(){return this.Mt}get rotationZ(){return this.Ft}get translationX(){return this.At}get translationY(){return this.bt}get translationZ(){return this.Ct}get charRotation(){return this.Dt}get flipX(){return this.Et}get flipY(){return this.kt}get invert(){return this.Rt}}const bt=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,-.5,.5,0,1,-.5,.5,0,1,.5,-.5,1,0,.5,.5,1,1]),H={As:16,bs:WebGL2RenderingContext.TRIANGLES,Cs:{Ms:{size:2,offset:0},Fs:{size:2,offset:8}}};class le{constructor(t){o(this,"$");o(this,"$s");o(this,"Ps");this.$=t,this.$s=t.createBuffer(),this.Ps=new Float32Array(bt.length)}Ts(t,e,i,s){const r=this.$,h=Xt(this.$),a=h[2],l=h[3],u=t/a*2-1,c=(t+i)/a*2-1,f=1-(e+s)/l*2,g=1-e/l*2,p=bt,m=this.Ps;for(let d=0;d<p.length;d+=4){const v=p[d],w=p[d+1],A=p[d+2],y=p[d+3],b=u+(v+.5)*(c-u),R=f+(w+.5)*(g-f);m[d]=b,m[d+1]=R,m[d+2]=A,m[d+3]=y}r.bindBuffer(r.ARRAY_BUFFER,this.$s),r.bufferData(r.ARRAY_BUFFER,m,r.DYNAMIC_DRAW),j(r,0,2,16,0),j(r,1,2,16,8),r.drawArrays(r.TRIANGLES,0,6),r.disableVertexAttribArray(1),r.disableVertexAttribArray(0),r.bindBuffer(r.ARRAY_BUFFER,null)}Ss(){this.$.deleteBuffer(this.$s)}}var C=(n=>(n.RECTANGLE="rectangle",n.LINE="line",n.ELLIPSE="ellipse",n.ARC="arc",n.TRIANGLE="triangle",n.BEZIER_CURVE="bezier_curve",n))(C||{});const ce={rectangle:2,line:2,ellipse:2,triangle:2,arc:3,bezier_curve:4};class ue{constructor(t){o(this,"$");o(this,"Es",new Map);o(this,"ks",null);this.$=t}Rs(t,e,i,s){const r=this.$,h=t.program;let a=this.Es.get(t);a||(a=new Map,this.Es.set(t,a),t.C(()=>this.Ds(t)));let l=a.get(e)||null;if(l)this.ks!==l&&(r.bindVertexArray(l),this.ks=l);else{l=r.createVertexArray(),a.set(e,l),r.bindVertexArray(l),this.ks=l,r.bindBuffer(r.ARRAY_BUFFER,s);const u=r.getAttribLocation(h,"A0");u!==-1&&j(r,u,i.Cs.Ms.size,i.As,i.Cs.Ms.offset,0,r.FLOAT,!1);const c=r.getAttribLocation(h,"A1");c!==-1&&j(r,c,i.Cs.Fs.size,i.As,i.Cs.Fs.offset,0,r.FLOAT,!1)}}Ds(t){const e=this.Es.get(t);if(e){for(const[,i]of e)i&&this.$.deleteVertexArray(i);this.Es.delete(t)}}Ls(){this.ks!==null&&(this.$.bindVertexArray(null),this.ks=null)}Ss(){for(const[,t]of this.Es)for(const[,e]of t)e&&this.$.deleteVertexArray(e);this.Es.clear()}}class U{}o(U,"BYTES_PER_INSTANCE",144),o(U,"FLOATS_PER_INSTANCE",36);function X(n,t){return{location:-1,size:n,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.BYTES_PER_INSTANCE,offset:t,divisor:1}}class nt{}o(nt,"STRIDE",U.BYTES_PER_INSTANCE),o(nt,"ATTRIBUTES",{A2:X(2,0),A3:X(2,8),A4:X(3,16),A5:X(4,28),A6:X(4,44),A7:X(4,60),A8:X(3,76),A9:X(3,88),Aa:X(4,100),Ab:X(4,116),Ac:X(3,132)});class fe{constructor(t=1e3,e=1.5){o(this,"Os");o(this,"zs");o(this,"Hs");o(this,"Bs",0);o(this,"Is",0);this.zs=t,this.Hs=e;const i=t*U.FLOATS_PER_INSTANCE;this.Os=new Float32Array(i)}Gs(t){if(t<=this.zs)return;const e=Math.ceil(t*this.Hs),i=this.zs;this.zs=e;const s=new Float32Array(e*U.FLOATS_PER_INSTANCE),r=i*U.FLOATS_PER_INSTANCE;s.set(this.Os.subarray(0,Math.min(r,this.Bs))),this.Os=s}Ns(t){this.Bs+=t,this.Is++}js(){this.Bs=0,this.Is=0}Qs(t=0,e){return this.Os.subarray(t,e??this.Bs)}get Xs(){return this.Is}get Ys(){return this.zs}get Ks(){return this.Bs}get Ws(){return this.Is===0}}class de{constructor(t){o(this,"Os");this.Os=t}Zs(t){this.Os.Is>=this.Os.zs&&this.Os.Gs(this.Os.Is+1);const e=this.Os.Os,i=this.Os.Bs;e[i+0]=t.x,e[i+1]=t.y,e[i+2]=t.width,e[i+3]=t.height,e[i+4]=t.char0,e[i+5]=t.char1,e[i+6]=t.char2,e[i+7]=t.r1,e[i+8]=t.g1,e[i+9]=t.b1,e[i+10]=t.a1,e[i+11]=t.r2,e[i+12]=t.g2,e[i+13]=t.b2,e[i+14]=t.a2,e[i+15]=t.invert,e[i+16]=t.flipX,e[i+17]=t.flipY,e[i+18]=t.charRot,e[i+19]=t.translationX,e[i+20]=t.translationY,e[i+21]=t.translationZ,e[i+22]=t.rotationX,e[i+23]=t.rotationY,e[i+24]=t.rotationZ;const s=t.curveParams0,r=t.curveParams1;return e[i+25]=s[0],e[i+26]=s[1],e[i+27]=s[2],e[i+28]=s[3],e[i+29]=r[0],e[i+30]=r[1],e[i+31]=r[2],e[i+32]=r[3],e[i+33]=t.depth,e[i+34]=t.baseZ,e[i+35]=t.geometryType,this.Os.Ns(U.FLOATS_PER_INSTANCE),this.Os.Is-1}get Xs(){return this.Os.Xs}}class ge{constructor(t,e=1e3){o(this,"$");o(this,"qs",null);o(this,"Vs",0);o(this,"Js",new WeakMap);o(this,"te",0);o(this,"se",new WeakMap);this.$=t,this.ee(e)}ee(t){const e=this.$;this.qs&&e.deleteBuffer(this.qs),this.te++,this.qs=e.createBuffer();const i=t*U.BYTES_PER_INSTANCE;Pt(e,e.ARRAY_BUFFER,this.qs,i,e.DYNAMIC_DRAW),this.Vs=t}ie(t){this.ee(t)}get Ys(){return this.Vs}re(t,e){if(e===0)return;const i=this.$;i.bindBuffer(i.ARRAY_BUFFER,this.qs);const s=e*U.FLOATS_PER_INSTANCE;i.bufferSubData(i.ARRAY_BUFFER,0,t,0,s)}ne(t){let e=this.Js.get(t);if(!e){e=new Map;const i=this.$;for(const s in nt.ATTRIBUTES){const r=s,h=i.getAttribLocation(t,r);h!==-1&&e.set(r,h)}this.Js.set(t,e)}return e}he(t){const e=this.$,i=t.program;if(this.se.get(i)===this.te)return;const s=this.ne(i);for(const[r,h]of s){const a=nt.ATTRIBUTES[r];a&&j(e,h,a.size,a.stride,a.offset,a.divisor,a.type,a.normalized)}this.se.set(i,this.te)}Ss(){this.qs&&(this.$.deleteBuffer(this.qs),this.qs=null)}}class pe{constructor(t,e=1e3,i=1.5){o(this,"$");o(this,"Os");o(this,"oe");o(this,"ae");this.$=t,this.Os=new fe(e,i),this.oe=new de(this.Os),this.ae=new ge(t,e)}ce(t){var r,h,a,l,u,c,f,g,p,m;const e=this.Os;e.Is>=e.zs&&e.Gs(e.Is+1);const i=e.Os,s=e.Bs;return i[s+0]=t.Ms[0],i[s+1]=t.Ms[1],i[s+2]=t.le[0],i[s+3]=t.le[1],i[s+4]=t.jt[0],i[s+5]=t.jt[1],i[s+6]=t.jt[2],i[s+7]=t.Xt[0],i[s+8]=t.Xt[1],i[s+9]=t.Xt[2],i[s+10]=t.Xt[3],i[s+11]=t.Yt[0],i[s+12]=t.Yt[1],i[s+13]=t.Yt[2],i[s+14]=t.Yt[3],i[s+15]=t.ue[0],i[s+16]=t.ue[1],i[s+17]=t.ue[2],i[s+18]=t.Dt,i[s+19]=((r=t.fe)==null?void 0:r[0])??0,i[s+20]=((h=t.fe)==null?void 0:h[1])??0,i[s+21]=((a=t.fe)==null?void 0:a[2])??0,i[s+22]=((l=t.de)==null?void 0:l[0])??0,i[s+23]=((u=t.de)==null?void 0:u[1])??0,i[s+24]=((c=t.de)==null?void 0:c[2])??0,t.pe&&t.ve?(i[s+25]=((f=t.ge)==null?void 0:f[0])??0,i[s+26]=((g=t.ge)==null?void 0:g[1])??0,i[s+27]=((p=t.me)==null?void 0:p[0])??0,i[s+28]=((m=t.me)==null?void 0:m[1])??0,i[s+29]=t.pe[0],i[s+30]=t.pe[1],i[s+31]=t.ve[0],i[s+32]=t.ve[1]):t._e?(i[s+25]=t._e[0],i[s+26]=t._e[1],i[s+27]=0,i[s+28]=0,i[s+29]=0,i[s+30]=0,i[s+31]=0,i[s+32]=0):(i[s+25]=0,i[s+26]=0,i[s+27]=0,i[s+28]=0,i[s+29]=0,i[s+30]=0,i[s+31]=0,i[s+32]=0),i[s+33]=t.ye||0,i[s+34]=t.we||0,i[s+35]=t.Ae||0,e.Ns(U.FLOATS_PER_INSTANCE),e.Is-1}be(){this.Os.Ys>this.ae.Ys&&this.ae.ie(this.Os.Ys)}get instanceBuffer(){return this.Os}get writer(){return this.oe}get Ce(){return this.Os.Xs}get Ws(){return this.Os.Ws}xe(){this.Os.js()}he(t){const e=this.Os.Xs;if(e===0)return;this.be();const i=this.Os.Qs();this.ae.re(i,e),this.ae.he(t)}Ts(t,e){const i=this.Os.Xs;i!==0&&this.$.drawArraysInstanced(t,0,e,i)}Ss(){this.ae.Ss()}}class G{constructor(t,e,i,s){o(this,"$");o(this,"Me");o(this,"Fe");o(this,"$e");o(this,"Pe",null);o(this,"Te",[0,0,0,0]);o(this,"Se",[0,0,0,0]);o(this,"Ee");var r,h;this.$=t,this.Me=e,this.Fe=i,this.$e=s,this.Ee=(r=this.Te,h=this.Se,{x:0,y:0,width:0,height:0,char0:0,char1:0,char2:0,r1:0,g1:0,b1:0,a1:0,r2:0,g2:0,b2:0,a2:0,invert:0,flipX:0,flipY:0,charRot:0,translationX:0,translationY:0,translationZ:0,rotationX:0,rotationY:0,rotationZ:0,curveParams0:r,curveParams1:h,depth:0,baseZ:0,geometryType:0});const a=this.$.createBuffer();Pt(this.$,this.$.ARRAY_BUFFER,a,this.$e.ke,this.$.STATIC_DRAW),this.Pe=a}get type(){return this.Fe}get unitGeometry(){return this.$e}get unitBuffer(){return this.Pe}get batch(){return this.Me}Re(){this.Me.xe()}De(){return!this.Me.Ws}Ss(){this.Me.Ss(),this.$.deleteBuffer(this.Pe)}Le(t,e,i){return this.Me.ce(t)}Oe(t,e,i,s,r,h){const a=r.At??0,l=r.bt??0,u=r.Ct??0,c=r.xt??0,f=r.Mt??0,g=r.Ft??0,p=this.Te,m=this.Se;p[0]=0,p[1]=0,p[2]=0,p[3]=0,m[0]=0,m[1]=0,m[2]=0,m[3]=0,h&&(h.bezStartX!==void 0&&h.bezStartY!==void 0&&h.bezEndX!==void 0&&h.bezEndY!==void 0?(p[0]=h.cp1x??0,p[1]=h.cp1y??0,p[2]=h.cp2x??0,p[3]=h.cp2y??0,m[0]=h.bezStartX??0,m[1]=h.bezStartY??0,m[2]=h.bezEndX??0,m[3]=h.bezEndY??0):h.arcStart===void 0&&h.arcStop===void 0||(p[0]=h.arcStart??0,p[1]=h.arcStop??0));const d=this.Ee;return d.x=t,d.y=e,d.width=i,d.height=s,d.char0=r.jt[0],d.char1=r.jt[1],d.char2=r.jt[2],d.r1=r.Xt[0],d.g1=r.Xt[1],d.b1=r.Xt[2],d.a1=r.Xt[3],d.r2=r.Yt[0],d.g2=r.Yt[1],d.b2=r.Yt[2],d.a2=r.Yt[3],d.invert=r.Rt?1:0,d.flipX=r.Gt?1:0,d.flipY=r.Nt?1:0,d.charRot=r.Dt,d.translationX=a,d.translationY=l,d.translationZ=u,d.rotationX=c,d.rotationY=f,d.rotationZ=g,d.depth=(h==null?void 0:h.depth)??0,d.baseZ=(h==null?void 0:h.baseZ)??0,d.geometryType=ce[this.Fe]??0,this.Me.writer.Zs(d)}}const me={ke:bt,ze:6,...H},ve={ke:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),ze:6,...H},Ae={ke:function(n=32){const t=[],e=2*Math.PI/n;for(let i=0;i<n;i++){const s=i*e,r=(i+1)%n*e,h=Math.cos(s),a=Math.sin(s),l=.5*(h+1),u=.5*(a+1),c=Math.cos(r),f=Math.sin(r),g=.5*(c+1),p=.5*(f+1);t.push(0,0,.5,.5,h,a,l,u,c,f,g,p)}return new Float32Array(t)}(32),ze:96,...H};let ye={ke:function(n){const t=[];for(let e=0;e<n;e++){const i=e/n,s=(e+1)/n;t.push(i,0,i,0,i,1,i,1,s,1,s,1)}return new Float32Array(t)}(32),ze:96,...H};const we={ke:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),ze:3,...H},be={ke:function(n=16){const t=[];for(let e=0;e<n;e++){const i=e/n,s=(e+1)/n;t.push(i,-.5,i,0,s,-.5,s,0,i,.5,i,1,i,.5,i,1,s,-.5,s,0,s,.5,s,1)}return new Float32Array(t)}(16),ze:96,...H},Ee={[C.RECTANGLE]:class extends G{constructor(n,t){super(n,t,C.RECTANGLE,me)}ce(n,t){return this.Oe(0,0,n.width,n.height,t)}},[C.LINE]:class extends G{constructor(n,t){super(n,t,C.LINE,ve)}ce(n,t){const e=n.x2-n.x1,i=n.y2-n.y1,s=Math.hypot(e,i),r=Math.atan2(i,e),h=t.It||1,a=Math.cos(-r),l=Math.sin(-r),u=n.x1*a-n.y1*l,c=n.x1*l+n.y1*a,f={...t,Ft:(t.Ft||0)+r};return this.Oe(u,c,s,h,f)}},[C.ELLIPSE]:class extends G{constructor(n,t){super(n,t,C.ELLIPSE,Ae)}ce(n,t){return this.Oe(0,0,n.width,n.height,t)}},[C.ARC]:class extends G{constructor(n,t){super(n,t,C.ARC,ye)}ce(n,t){const e=B(n.start),i=B(n.stop);return this.Oe(0,0,n.width,n.height,t,{arcStart:e,arcStop:i})}},[C.TRIANGLE]:class extends G{constructor(n,t){super(n,t,C.TRIANGLE,we)}ce(n,t){const e=Math.min(n.x1,n.x2,n.x3),i=Math.max(n.x1,n.x2,n.x3),s=Math.min(n.y1,n.y2,n.y3),r=i-e,h=Math.max(n.y1,n.y2,n.y3)-s;return this.Oe(e,s,r,h,t)}},[C.BEZIER_CURVE]:class extends G{constructor(n,t){super(n,t,C.BEZIER_CURVE,be)}ce(n,t){return this.Oe(0,0,1,t.It||1,t,{cp1x:n.cp1x,cp1y:n.cp1y,cp2x:n.cp2x,cp2y:n.cp2y,bezStartX:n.x1,bezStartY:n.y1,bezEndX:n.x2,bezEndY:n.y2})}}};class xe{constructor(t){o(this,"$");o(this,"He");o(this,"Be");o(this,"Ie",null);o(this,"Ge",new Map);o(this,"Ne",null);this.$=t,this.Be=new ue(t),this.He=new Map;for(const e of Object.values(C)){const i=new pe(t),s=new Ee[e](t,i);this.He.set(e,s)}}je(t){this.Ie=null,this.Ge.clear(),this.Ne=null;let e=null,i=null,s=null,r=!1;for(const h of t)e===h.material&&i===h.type&&r===h.state.Ot||(s&&s.De()&&this.Qe(s,e,i,r),e=h.material,i=h.type,s=this.He.get(i),r=h.state.Ot,s.Re()),s.ce(h.params,h.state);s&&s.De()&&this.Qe(s,e,i,r),this.Be.Ls()}Qe(t,e,i,s){if(this.Ie!==e.shader&&(e.shader.dt(),this.Ie=e.shader),this.Ne!==e&&(e.shader.gt(e.uniforms),this.Ne=e),this.Ge.get(e.shader)!==s){const a=Xt(this.$);e.shader.gt({Ur:a[2]/a[3],Us:[a[2],a[3]],Ut:1,Uu:s?1:0}),this.Ge.set(e.shader,s)}const r=t.unitGeometry,h=t.unitBuffer;try{this.Be.Rs(e.shader,String(i),r,h),t.batch.he(e.shader),t.batch.Ts(r.bs,r.ze)}finally{t.Re()}}Ss(){for(const t of this.He.values())t.Ss();this.He.clear(),this.Be.Ss()}}function Lt(n){let t=0;for(let e=0;e<n.length;e++)t=(t<<5)-t+n.charCodeAt(e),t&=t;return t}const _t=new WeakMap;let Te=1;function It(n){if(n==null)return 0;if(typeof n!="object"&&typeof n!="function")return Lt(String(n));let t=_t.get(n);return t||(t=Te++,_t.set(n,t)),t}function W(n,t){return(n<<5)-n+t}const ht=`#version 300 es
8
- in vec2 A0;in vec2 A1;in vec2 A2;in vec2 A3;in vec3 A4;in vec4 A5;in vec4 A6;in vec4 A7;in vec3 A8;in vec3 A9;in vec4 Aa;in vec4 Ab;in vec3 Ac;uniform vec2 Us;uniform float Ut;uniform float Uu;out vec2 v_uv;out vec3 v_glyphIndex;out vec4 v_glyphColor;out vec4 v_cellColor;out vec4 v_glyphFlags;out vec3 v_worldPosition;out vec3 v_normal;out float v_geometryType;const float A=6.28318530718f;const int B=2;const int C=3;const int D=4;vec2 E(float F,vec2 G,vec2 H,vec2 I,vec2 J){float K=1.0f-F;float L=K*K;float M=L*K;float N=F*F;float O=N*F;return M*G+3.0f*L*F*H+3.0f*K*N*I+O*J;}vec2 P(float F,vec2 G,vec2 H,vec2 I,vec2 J){float K=1.0f-F;float L=K*K;float N=F*F;return-3.0f*L*G+3.0f*(L-2.0f*K*F)*H+3.0f*(2.0f*K*F-N)*I+3.0f*N*J;}vec3 Q(vec3 R,float S){float T=cos(S);float U=sin(S);return vec3(R.x,R.y*T-R.z*U,R.y*U+R.z*T);}vec3 V(vec3 R,float S){float T=cos(S);float U=sin(S);return vec3(R.x*T+R.z*U,R.y,-R.x*U+R.z*T);}vec3 W(vec3 R,float S){float T=cos(S);float U=sin(S);return vec3(R.x*T-R.y*U,R.x*U+R.y*T,R.z);}vec3 X(vec3 R,vec3 Y){vec3 Z=R;if(Y.z!=0.0f){Z=W(Z,Y.z);}if(Y.y!=0.0f){Z=V(Z,Y.y);}if(Y.x!=0.0f){Z=Q(Z,Y.x);}return Z;}void main(){v_uv=A1;v_glyphIndex=A4;v_glyphColor=A5;v_cellColor=A6;v_glyphFlags=A7;vec4 a=Aa;vec4 b=Ab;vec2 c=A3;vec2 d=A2;float e=Ac.x;float f=Ac.y;int g=int(Ac.z);vec2 h=d;vec2 i=h+c*0.5f;float j=f+e*0.5f;vec3 k=vec3(i,j);vec3 l;if(g==D){float F=clamp(A0.x,0.0f,1.0f);vec2 G=b.xy;vec2 H=a.xy;vec2 I=a.zw;vec2 J=b.zw;vec2 m=E(F,G,H,I,J);vec2 n=P(F,G,H,I,J);float o=length(n);vec2 p=o>0.0f?n/o:vec2(1.0f,0.0f);vec2 q=vec2(-p.y,p.x);vec2 r=m;vec2 s=r+q*A0.y*c.y;l=vec3(s,f);}else if(g==C){float t=mod(a.x,A);if(t<0.0f){t+=A;}float u=mod(a.y,A);if(u<0.0f){u+=A;}float v=t-u;if(v<=0.0f){v+=A;}float S=t-A0.x*v;vec2 w=vec2(cos(S),sin(S))*A0.y;vec2 s=w*c+h;l=vec3(s,f);}else if(g==B){vec2 s=A0.xy*c+h;l=vec3(s,f);}vec3 x=X(l,A9);vec3 y=x+A8;vec3 z=vec3(0.0f,0.0f,1.0f);v_worldPosition=y;v_normal=z;v_geometryType=float(g);vec2 AA=((y.xy)/Us)*2.0f;AA.y=-AA.y;float AB=y.z/Us.y;float AC=clamp(-AB*Ut,-0.99f,0.99f);if(Uu>0.5f){gl_Position=vec4(AA,AC,1.0f);}else{float AD=0.5f;float AE=1.0f/(1.0f-AB*AD);AA*=AE;gl_Position=vec4(AA,AC,1.0f);}}`;class Re{constructor(t){o(this,"Xe",0);o(this,"Ye");o(this,"Ke");o(this,"We");o(this,"Ze",new Map);this.Ye=new k(t,ht,`#version 300 es
9
- precision highp float;in vec3 v_glyphIndex;in vec4 v_glyphColor;in vec4 v_cellColor;in vec4 v_glyphFlags;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 A;void main(){int B=int(v_glyphFlags.r>0.5?1:0);int C=int(v_glyphFlags.g>0.5?1:0);int D=int(v_glyphFlags.b>0.5?1:0);float E=float(B|(C<<1)|(D<<2))/255.;o_character=vec4(v_glyphIndex.xy,E,clamp(v_glyphFlags.a,0.,1.));o_primaryColor=vec4(v_glyphColor.rgb,v_glyphColor.a);o_secondaryColor=vec4(v_cellColor.rgb,v_cellColor.a);A=vec4(0.);}`),this.Ke=new k(t,ht,`#version 300 es
10
- precision highp float;in vec2 v_uv;uniform sampler2D U6;uniform sampler2D U7;uniform sampler2D U8;uniform sampler2D U9;uniform vec2 Ua;uniform bool Ub;uniform bool Uc;uniform bool Ud;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 A;void main(){vec2 B=vec2(v_uv.x,1.-v_uv.y);vec2 C=B*Ua;vec2 D=(floor(C)+0.5f)/Ua;vec4 E=texture(U6,D);vec4 F=Ub?texture(U7,D):vec4(0.);if(Ub&&F.a==0.){discard;}vec4 G=Uc?texture(U8,D):vec4(0.);vec4 H=Ud?texture(U9,D):vec4(0.);o_character=E;o_primaryColor=F;o_secondaryColor=G;A=H;}`),this.We={id:this.Xe++,shader:this.Ye,uniforms:Object.freeze({}),hash:this.qe(this.Ye,{}),isBuiltIn:!0}}get Ve(){return this.We}get tt(){return this.Ke}st(t,e={}){return{id:this.Xe++,shader:t,uniforms:Object.freeze({...e}),hash:0,isBuiltIn:!1}}qe(t,e){const i=It(t.program),s=function(r,h){let a=0;const l=Object.keys(r).sort();for(const u of l)a=W(a,Lt(u)),a=W(a,h(r[u]));return a}(e,this.Je.bind(this));return W(i,s)}Je(t){return typeof t=="number"||typeof t=="boolean"?function(e){return typeof e=="boolean"?e?1:0:Math.floor(e)}(t):Array.isArray(t)?function(e){let i=0;const s=Array.isArray(e[0])?e.flat():e;for(const r of s)i=W(i,typeof r=="number"?r:0);return i}(t):t instanceof Float32Array||t instanceof Int32Array?function(e){let i=0;const s=Math.min(e.length,16);for(let r=0;r<s;r++)i=W(i,e[r]);return i}(t):t instanceof WebGLTexture||z(t)?It(t):0}Ss(){this.Ye.dispose(),this.Ke.dispose(),this.Ze.clear()}}class Fe{constructor(){o(this,"ti",[]);o(this,"si",1);o(this,"le",0)}ei(t,e){if(this.le>=this.ti.length){const s={id:this.si++,type:t,params:{},state:rt.Bt(),material:e};this.ti.push(s)}const i=this.ti[this.le];return i.id=this.si++,i.type=t,i.material=e,this.le++,i}ii(t,e,i){const s=this.ei(C.RECTANGLE,i),r=s.params;return r.width=t.width,r.height=t.height,e.Zt(s.state),s.id}ri(t,e,i){const s=this.ei(C.LINE,i),r=s.params;return r.x1=t.x1,r.y1=t.y1,r.x2=t.x2,r.y2=t.y2,r.thickness=t.thickness,e.Zt(s.state),s.id}ni(t,e,i){const s=this.ei(C.ELLIPSE,i),r=s.params;return r.width=t.width,r.height=t.height,r.startAngle=t.startAngle,r.endAngle=t.endAngle,r.segments=t.segments,e.Zt(s.state),s.id}hi(t,e,i){const s=this.ei(C.ARC,i),r=s.params;return r.width=t.width,r.height=t.height,r.start=t.start,r.stop=t.stop,e.Zt(s.state),s.id}oi(t,e,i){const s=this.ei(C.TRIANGLE,i),r=s.params;return r.x1=t.x1,r.y1=t.y1,r.x2=t.x2,r.y2=t.y2,r.x3=t.x3,r.y3=t.y3,e.Zt(s.state),s.id}ai(t,e,i){const s=this.ei(C.BEZIER_CURVE,i),r=s.params;return r.x1=t.x1,r.y1=t.y1,r.cp1x=t.cp1x,r.cp1y=t.cp1y,r.cp2x=t.cp2x,r.cp2y=t.cp2y,r.x2=t.x2,r.y2=t.y2,r.thickness=t.thickness,r.segments=t.segments,e.Zt(s.state),s.id}xe(){this.le=0}[Symbol.iterator](){let t=0;const e=this.le,i=this.ti;return{next:()=>t<e?{value:i[t++],done:!1}:{value:void 0,done:!0}}}}class Me{constructor(t){o(this,"$");o(this,"Ie",null);o(this,"ci");o(this,"li");o(this,"ui");o(this,"fi");o(this,"di");o(this,"pi",null);o(this,"gi",{});o(this,"mi",[]);o(this,"_i",[]);o(this,"yi",[]);o(this,"wi",null);o(this,"Ai",[0,0,0,0]);o(this,"bi",1);o(this,"Ci",new Float32Array(4));this.$=t,t.enable(t.DEPTH_TEST),t.depthFunc(t.LEQUAL),t.clearDepth(1),t.depthMask(!0),t.disable(t.CULL_FACE),this.ui=new rt,this.li=new Re(t),this.fi=new Fe,this.ci=new xe(t),this.di=new le(t);const e=[0,0,t.canvas.width,t.canvas.height];wt(t,e),this.mi.push(null),this._i.push(e),this.yi.push(1),this.wi=null,this.Ai=e,this.bi=1}X(){this.mi.push(this.wi),this._i.push([...this.Ai]),this.yi.push(this.bi)}q(){const t=this.mi.pop()??null,e=this._i.pop()??[0,0,this.$.canvas.width,this.$.canvas.height],i=this.yi.pop()??1;this.Y(t,e[2],e[3],i)}Y(t,e,i,s=1){const r=this.$;this.wi!==t&&(r.bindFramebuffer(r.FRAMEBUFFER,t),this.wi=t),this.bi=s;const h=[0,0,e,i];this.Ai[0]===h[0]&&this.Ai[1]===h[1]&&this.Ai[2]===h[2]&&this.Ai[3]===h[3]||(r.viewport(...h),wt(r,h),this.Ai=h)}xi(t){this.Ie!==t&&(this.Ie=t,t.dt())}Mi(t,e){return new k(this.$,t,e)}Fi(t){this.pi=t,t&&(this.gi={})}$i(){this.pi=null,this.gi={}}_t(t,e){this.gi[t]=e}gt(t){Object.assign(this.gi,t)}Pi(t){return new k(this.$,ht,t)}Ti(t,e,i,s){t instanceof it||!s||t.Si(s),this.fi.ii({width:e??t.width,height:i??t.height},this.ui,t.V())}Ei(t,e,i,s){this.di.Ts(t,e,i,s)}ki(t,e){if(this.pi){const i=this.li.st(this.pi,this.gi);this.fi.ii({width:t,height:e},this.ui,i)}else this.fi.ii({width:t,height:e},this.ui,this.li.Ve)}Ri(t,e,i,s){this.fi.ri({x1:t,y1:e,x2:i,y2:s},this.ui,this.li.Ve)}Di(t,e){this.fi.ni({width:t,height:e},this.ui,this.li.Ve)}Li(t,e,i,s,r,h){this.fi.oi({x1:t,y1:e,x2:i,y2:s,x3:r,y3:h},this.ui,this.li.Ve)}Oi(t,e,i,s,r,h,a,l){this.fi.ai({x1:t,y1:e,cp1x:i,cp1y:s,cp2x:r,cp2y:h,x2:a,y2:l},this.ui,this.li.Ve)}zi(t,e,i,s){this.fi.hi({width:t,height:e,start:i,stop:s},this.ui,this.li.Ve)}Hi(t,e,i=1,s={}){return new it(this.$,t,e,i,s,this)}Bi(t,e=t,i=t,s=255){this.ui._s(t,e??t,i??t,s);const[r,h,a,l]=this.ui.canvasBackgroundColor;this.Ii(r,h,a,l,!1)}xe(t=0,e=0,i=0,s=0){this.Ii(t,e,i,s,!0)}Ii(t,e,i,s,r){const h=this.$,a=this.Ci;if(this.bi>1){a[0]=r?1:0,a[1]=r?1:0,a[2]=0,a[3]=0,h.clearBufferfv(h.COLOR,0,a),a[0]=0,a[1]=0,a[2]=0,a[3]=0,h.clearBufferfv(h.COLOR,1,a),this.bi>=3&&(a[0]=t,a[1]=e,a[2]=i,a[3]=s,h.clearBufferfv(h.COLOR,2,a)),this.bi>=3&&(a[0]=0,a[1]=0,a[2]=0,a[3]=0);for(let l=3;l<this.bi;l++)h.clearBufferfv(h.COLOR,l,a)}else h.clearColor(t,e,i,s),h.clear(h.COLOR_BUFFER_BIT)}Gi(){const t=[0,0,this.$.canvas.width,this.$.canvas.height];this.$.viewport(...t),wt(this.$,t),this.Ai=t,this._i.length>0&&(this._i[0]=t)}Z(){const t=this.fi;this.ci.je(t),t.xe(),this.Ie=null}Ss(){this.li.Ss(),this.ci.Ss(),this.di.Ss()}get context(){return this.$}get state(){return this.ui}get materialManager(){return this.li}}const S={readShort:(n,t)=>(S.t.uint16[0]=n[t]<<8|n[t+1],S.t.int16[0]),readUshort:(n,t)=>n[t]<<8|n[t+1],readUshorts(n,t,e){const i=[];for(let s=0;s<e;s++)i.push(S.readUshort(n,t+2*s));return i},readUint(n,t){const e=S.t.uint8;return e[3]=n[t],e[2]=n[t+1],e[1]=n[t+2],e[0]=n[t+3],S.t.uint32[0]},readASCII(n,t,e){let i="";for(let s=0;s<e;s++)i+=String.fromCharCode(n[t+s]);return i},t:(()=>{const n=new ArrayBuffer(8);return{uint8:new Uint8Array(n),int16:new Int16Array(n),uint16:new Uint16Array(n),uint32:new Uint32Array(n)}})()};function ot(n){return n+3&-4}function at(n,t,e){n[t]=e>>>8&255,n[t+1]=255&e}function I(n,t,e){n[t]=e>>>24&255,n[t+1]=e>>>16&255,n[t+2]=e>>>8&255,n[t+3]=255&e}function Ce(n,t,e){for(let i=0;i<e.length;i++)n[t+i]=255&e.charCodeAt(i)}function Et(n,t,e){const i=t+e;let s=0;const r=S.t;for(let h=t;h<i;h+=4)r.uint8[3]=n[h]||0,r.uint8[2]=n[h+1]||0,r.uint8[1]=n[h+2]||0,r.uint8[0]=n[h+3]||0,s=s+(r.uint32[0]>>>0)>>>0;return s>>>0}class Se{constructor(t){o(this,"b");o(this,"p",0);o(this,"bitbuf",0);o(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const i=this.b[this.p++]||0;this.bitbuf|=i<<this.bitcnt,this.bitcnt+=8}const e=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,e}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function K(n){let t=32,e=0;for(const a of n)a&&(a<t&&(t=a),a>e&&(e=a));if(e===0)return{min:0,max:0,table:new Map};const i=new Uint32Array(e+1);for(const a of n)a&&i[a]++;const s=new Uint32Array(e+1);let r=0;i[0]=0;for(let a=1;a<=e;a++)r=r+i[a-1]<<1,s[a]=r;const h=new Map;for(let a=0;a<n.length;a++){const l=n[a];if(!l)continue;const u=s[l]++;let c=h.get(l);c||(c=[],h.set(l,c)),c[Pe(u,l)]=a}return{min:t,max:e,table:h}}function xt(n,t){let e=0;for(let i=1;i<=t.max;i++){e|=n.readBits(1)<<i-1;const s=t.table.get(i);if(s&&e<s.length){const r=s[e];if(r!==void 0)return r}}throw new Error("Invalid Huffman code")}function Pe(n,t){let e=0;for(let i=0;i<t;i++)e=e<<1|1&n,n>>>=1;return e>>>0}function Oe(n){if(n.length<2)throw new Error("ZLIB data too short");const t=n[0],e=n[1];if((15&t)!=8)throw new Error("Unsupported ZLIB compression method");if(((t<<8)+e)%31!=0)throw new Error("Bad ZLIB header check");let i=2;32&e&&(i+=4);const s=[];return function(r,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],l=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],u=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],c=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let f=0;for(;!f;){f=r.readBits(1);const g=r.readBits(2);if(g===0){r.alignToByte();const p=r.readBits(16);if((65535&(65535^p))!==r.readBits(16))throw new Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let m=0;m<p;m++)h.push(r.readBits(8))}else{if(g!==1&&g!==2)throw new Error("Unsupported DEFLATE type");{let p,m;if(g===1){const d=new Array(288).fill(0);for(let v=0;v<=143;v++)d[v]=8;for(let v=144;v<=255;v++)d[v]=9;for(let v=256;v<=279;v++)d[v]=7;for(let v=280;v<=287;v++)d[v]=8;p=K(d),m=K(new Array(32).fill(5))}else{const d=r.readBits(5)+257,v=r.readBits(5)+1,w=r.readBits(4)+4,A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],y=new Array(19).fill(0);for(let M=0;M<w;M++)y[A[M]]=r.readBits(3);const b=K(y),R=[];for(;R.length<d+v;){const M=xt(r,b);if(M<=15)R.push(M);else if(M===16){const _=r.readBits(2)+3,O=R[R.length-1]||0;for(let pt=0;pt<_;pt++)R.push(O)}else if(M===17){const _=r.readBits(3)+3;for(let O=0;O<_;O++)R.push(0)}else{if(M!==18)throw new Error("Invalid code length symbol");{const _=r.readBits(7)+11;for(let O=0;O<_;O++)R.push(0)}}}const F=R.slice(0,d),P=R.slice(d,d+v);p=K(F),m=K(P)}for(;;){const d=xt(r,p);if(d<256)h.push(d);else{if(d===256)break;if(d>256&&d<286){const v=d-257;let w=a[v];const A=l[v];A&&(w+=r.readBits(A));const y=xt(r,m);if(y>=30)throw new Error("Invalid distance symbol");let b=u[y];const R=c[y];R&&(b+=r.readBits(R));const F=h.length-b;if(F<0)throw new Error("Invalid distance");for(let P=0;P<w;P++)h.push(h[F+P]||0)}else if(d===286||d===287)throw new Error("Reserved length symbol")}}}}}}(new Se(n.subarray(i)),s),new Uint8Array(s)}function Ue(n){const t=S,e=new Uint8Array(n);if(t.readASCII(e,0,4)!=="wOFF")throw new Error("Invalid WOFF signature");const i=t.readUint(e,4),s=t.readUshort(e,12),r=t.readUint(e,16),h=[];let a=44;for(let A=0;A<s;A++){const y=t.readASCII(e,a,4),b=t.readUint(e,a+4),R=t.readUint(e,a+8),F=t.readUint(e,a+12),P=t.readUint(e,a+16);h.push({tag:y,offset:b,compLength:R,origLength:F,checksum:P}),a+=20}for(const A of h){const y=new Uint8Array(e.buffer,A.offset,A.compLength);if(A.compLength===A.origLength)A.data=new Uint8Array(y);else if(A.data=Oe(y),A.data.length!==A.origLength)if(A.data.length<A.origLength){const b=new Uint8Array(A.origLength);b.set(A.data),A.data=b}else A.data=A.data.subarray(0,A.origLength)}const l=s;let u=1,c=0;for(;u<<1<=l;)u<<=1,c++;const f=16*u,g=16*l-f;let p=12+16*l;const m={};for(const A of h)m[A.tag]=p,p=ot(p+A.data.length);const d=Math.max(r||0,p),v=new Uint8Array(d);I(v,0,i),at(v,4,l),at(v,6,f),at(v,8,c),at(v,10,g);let w=12;for(const A of h){Ce(v,w,A.tag),w+=4;const y=A.data;if(A.tag==="head"&&y.length>=12){const b=new Uint8Array(y);I(b,8,0),I(v,w,Et(b,0,ot(b.length))),w+=4}else I(v,w,Et(y,0,ot(y.length))),w+=4;I(v,w,m[A.tag]),w+=4,I(v,w,A.data.length),w+=4}for(const A of h){const y=m[A.tag];v.set(A.data,y)}if(h.find(A=>A.tag==="head")){const A=m.head,y=function(b,R){const F=R+8,P=[b[F],b[F+1],b[F+2],b[F+3]];I(b,F,0);const M=2981146554-(Et(b,0,ot(b.length))>>>0)>>>0;return b[F]=P[0],b[F+1]=P[1],b[F+2]=P[2],b[F+3]=P[3],M>>>0}(v,A);I(v,A+8,y)}return v.buffer}const Xe={parseTab(n,t,e){const i={tables:[],ids:{},off:t};n=new Uint8Array(n.buffer,t,e),t=0;const s=S,r=s.readUshort;r(n,t);const h=r(n,t+=2);t+=2;const a=[];for(let l=0;l<h;l++){const u=r(n,t),c=r(n,t+=2);t+=2;const f=s.readUint(n,t);t+=4;const g=`p${u}e${c}`;let p=a.indexOf(f);if(p===-1){let m;p=i.tables.length,a.push(f);const d=r(n,f);m=d===4?this.parse4(n,f):d===12?this.parse12(n,f):{format:d},i.tables.push(m)}i.ids[g]=p}return i},parse4(n,t){const e=S,i=e.readUshort,s=e.readUshorts,r=t,h=i(n,t+=2);i(n,t+=2);const a=i(n,t+=2)>>>1,l={format:4,searchRange:i(n,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,l.entrySelector=i(n,t),t+=2,l.rangeShift=i(n,t),t+=2,l.endCount=s(n,t,a),t+=2*a,t+=2,l.startCount=s(n,t,a),t+=2*a;for(let u=0;u<a;u++)l.idDelta.push(e.readShort(n,t)),t+=2;return l.idRangeOffset=s(n,t,a),t+=2*a,l.glyphIdArray=s(n,t,r+h-t>>1),l},parse12(n,t){const e=S.readUint;e(n,t+=4),e(n,t+=4);const i=e(n,t+=4);t+=4;const s=new Uint32Array(3*i);for(let r=0;r<3*i;r+=3)s[r]=e(n,t+(r<<2)),s[r+1]=e(n,t+(r<<2)+4),s[r+2]=e(n,t+(r<<2)+8);return{format:12,groups:s}}},Le={parseTab(n,t,e){const i=S;t+=18;const s=i.readUshort(n,t);t+=2,t+=16;const r=i.readShort(n,t);t+=2;const h=i.readShort(n,t);t+=2;const a=i.readShort(n,t);t+=2;const l=i.readShort(n,t);return t+=2,t+=6,{unitsPerEm:s,xMin:r,yMin:h,xMax:a,yMax:l,indexToLocFormat:i.readShort(n,t)}}},_e={parseTab(n,t,e){const i=S;t+=4;const s=i.readShort,r=i.readUshort;return{ascender:s(n,t),descender:s(n,t+2),lineGap:s(n,t+4),advanceWidthMax:r(n,t+6),minLeftSideBearing:s(n,t+8),minRightSideBearing:s(n,t+10),xMaxExtent:s(n,t+12),caretSlopeRise:s(n,t+14),caretSlopeRun:s(n,t+16),caretOffset:s(n,t+18),res0:s(n,t+20),res1:s(n,t+22),res2:s(n,t+24),res3:s(n,t+26),metricDataFormat:s(n,t+28),numberOfHMetrics:r(n,t+30)}}},Ie={parseTab(n,t,e,i){const s=S,r=[],h=[],a=i.maxp.numGlyphs,l=i.hhea.numberOfHMetrics;let u=0,c=0,f=0;for(;f<l;)u=s.readUshort(n,t+(f<<2)),c=s.readShort(n,t+(f<<2)+2),r.push(u),h.push(c),f++;for(;f<a;)r.push(u),h.push(c),f++;return{aWidth:r,lsBearing:h}}},Nt={cmap:Xe,head:Le,hhea:_e,maxp:{parseTab(n,t,e){const i=S;return i.readUint(n,t),t+=4,{numGlyphs:i.readUshort(n,t)}}},hmtx:Ie,loca:{parseTab(n,t,e,i){const s=S,r=[],h=i.head.indexToLocFormat,a=i.maxp.numGlyphs+1;if(h===0)for(let l=0;l<a;l++)r.push(s.readUshort(n,t+(l<<1))<<1);else if(h===1)for(let l=0;l<a;l++)r.push(s.readUint(n,t+(l<<2)));return r}},glyf:{parseTab(n,t,e,i){const s=[],r=i.maxp.numGlyphs;for(let h=0;h<r;h++)s.push(null);return s},Ni(n,t){const e=S,i=n.ji,s=n.loca;if(s[t]===s[t+1])return null;const r=lt.findTable(i,"glyf",n.Qi);if(!r)return null;let h=r[0]+s[t];const a={};if(a.noc=e.readShort(i,h),h+=2,a.xMin=e.readShort(i,h),h+=2,a.yMin=e.readShort(i,h),h+=2,a.xMax=e.readShort(i,h),h+=2,a.yMax=e.readShort(i,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let g=0;g<a.noc;g++)a.endPts.push(e.readUshort(i,h)),h+=2;const l=e.readUshort(i,h);if(h+=2,i.length-h<l)return null;h+=l;const u=a.endPts[a.noc-1]+1;a.flags=[];for(let g=0;g<u;g++){const p=i[h];if(h++,a.flags.push(p),8&p){const m=i[h];h++;for(let d=0;d<m;d++)a.flags.push(p),g++}}a.xs=[];for(let g=0;g<u;g++){const p=a.flags[g],m=!!(16&p);2&p?(a.xs.push(m?i[h]:-i[h]),h++):m?a.xs.push(0):(a.xs.push(e.readShort(i,h)),h+=2)}a.ys=[];for(let g=0;g<u;g++){const p=a.flags[g],m=!!(32&p);4&p?(a.ys.push(m?i[h]:-i[h]),h++):m?a.ys.push(0):(a.ys.push(e.readShort(i,h)),h+=2)}let c=0,f=0;for(let g=0;g<u;g++)c+=a.xs[g],f+=a.ys[g],a.xs[g]=c,a.ys[g]=f}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},lt={parse(n){const t=new Uint8Array(n);S.readASCII(t,0,4)==="wOFF"&&(n=Ue(n));const e=new Uint8Array(n),i=Nt,s={},r={ji:e,Xi:0,Qi:0};for(const h in i){const a=h,l=lt.findTable(e,a,0);if(l){const[u,c]=l;let f=s[u];f==null&&(f=i[a].parseTab(e,u,c,r),s[u]=f),Object.assign(r,{[a]:f})}}return[r]},findTable(n,t,e){const i=S,s=i.readUshort(n,e+4);let r=e+12;for(let h=0;h<s;h++){const a=i.readASCII(n,r,4);i.readUint(n,r+4);const l=i.readUint(n,r+8),u=i.readUint(n,r+12);if(a===t)return[l,u];r+=16}return null},T:Nt,B:S};function Dt(n,t,e){if(n.idRangeOffset[e]===0)return t+n.idDelta[e]&65535;{const i=n.startCount.length,s=n.idRangeOffset[e]/2+(t-n.startCount[e])-(i-e);if(s>=0&&n.glyphIdArray&&s<n.glyphIdArray.length){const r=n.glyphIdArray[s];if(r!==0)return r+n.idDelta[e]&65535}}return 0}class Ne{Yi(t){var i;const e=[];return(i=t.cmap)!=null&&i.tables?(t.cmap.tables.forEach(s=>{if(s.format===4){const r=this.Ki(s);e.push(...r)}else if(s.format===12){const r=this.Wi(s);e.push(...r)}}),[...new Set(e)]):[]}Ki(t){const e=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return e;for(let i=0;i<t.startCount.length;i++){const s=t.startCount[i],r=t.endCount[i];if(s!==65535||r!==65535)for(let h=s;h<=r;h++)Dt(t,h,i)>0&&this.Zi(e,h)}return e}Wi(t){const e=[];if(!t.groups)return e;for(let i=0;i<t.groups.length;i+=3){const s=t.groups[i],r=t.groups[i+1],h=t.groups[i+2];for(let a=s;a<=r;a++)h+(a-s)>0&&this.Zi(e,a)}return e}Zi(t,e){try{const i=String.fromCodePoint(e);t.push(i)}catch{}}}class De{constructor(t){o(this,"qi");o(this,"Vi");o(this,"R");o(this,"P",null);o(this,"Ji",0);o(this,"tr",0);this.R=t,this.qi=document.createElement("canvas"),this.Vi=this.qi.getContext("2d",{willReadFrequently:!0,alpha:!0})}sr(t,e,i,s){const r=t.length;this.Ji=Math.ceil(Math.sqrt(r)),this.tr=Math.ceil(r/this.Ji);const h=e.width*this.Ji,a=e.height*this.tr;this.er(h,a),this.ir(t,e,this.Ji,i,s),this.P?this.P.width===h&&this.P.height===a||this.P.resize(h,a):this.P=this.R.Hi(h,a,1,{filter:"nearest"}),this.P.j(this.qi)}er(t,e){this.qi.width=t,this.qi.height=e,this.qi.style.width=t+"px",this.qi.style.height=e+"px",this.Vi.imageSmoothingEnabled=!1,this.qi.style.imageRendering="pixelated",this.Vi.clearRect(0,0,t,e),this.Vi.textBaseline="top",this.Vi.textAlign="left",this.Vi.fillStyle="white"}ir(t,e,i,s,r){const h=s/r.head.unitsPerEm;for(let a=0;a<t.length;a++){const l=a%i,u=Math.floor(a/i),c=t[a].glyphData;if(!c)continue;const f=c.advanceWidth*h,g=l*e.width,p=u*e.height,m=g+.5*e.width,d=p+.5*e.height,v=Math.round(m-.5*e.width),w=Math.round(d-.5*s),A=v+.5*(e.width-f),y=w+r.hhea.ascender*h;this.rr(c,A,y,h)}}rr(t,e,i,s){if(!t||!t.xs||t.noc===0)return;const{xs:r,ys:h,endPts:a,flags:l}=t;if(!(r&&h&&a&&l))return;this.Vi.beginPath();let u=0;for(let c=0;c<a.length;c++){const f=a[c];if(!(f<u)){if(f>=u){const g=e+r[u]*s,p=i-h[u]*s;this.Vi.moveTo(g,p);let m=u+1;for(;m<=f;)if(1&l[m]){const d=e+r[m]*s,v=i-h[m]*s;this.Vi.lineTo(d,v),m++}else{const d=e+r[m]*s,v=i-h[m]*s;if(m+1>f){const A=e+r[u]*s,y=i-h[u]*s;if(1&l[u])this.Vi.quadraticCurveTo(d,v,A,y);else{const b=(d+A)/2,R=(v+y)/2;this.Vi.quadraticCurveTo(d,v,b,R)}break}const w=m+1;if(1&l[w]){const A=e+r[w]*s,y=i-h[w]*s;this.Vi.quadraticCurveTo(d,v,A,y),m=w+1}else{const A=(d+(e+r[w]*s))/2,y=(v+(i-h[w]*s))/2;this.Vi.quadraticCurveTo(d,v,A,y),m=w}}this.Vi.closePath()}u=f+1}}this.Vi.fill()}Ss(){var t;(t=this.P)==null||t.dispose(),this.P=null}get framebuffer(){return this.P}get columns(){return this.Ji}get rows(){return this.tr}}class Yt{nr(t,e){const i=t.cmap;if(!i||!i.tables)return 0;let s=0;for(const r of i.tables)if(r.format===4?s=this.hr(e,r):r.format===12&&(s=this.ar(e,r)),s>0)break;return s}cr(t,e){const i=e.codePointAt(0);return i===void 0?0:this.nr(t,i)}lr(t,e){const i=t.hmtx;return i&&i.aWidth&&i.aWidth.length!==0?e<i.aWidth.length?i.aWidth[e]:i.aWidth[i.aWidth.length-1]:0}ur(t,e){const i=e/t.head.unitsPerEm,s=t.hhea.ascender*i,r=t.hhea.descender*i,h=t.hhea.lineGap*i;return{ascender:s,descender:r,lineGap:h,lineHeight:s-r+h,unitsPerEm:t.head.unitsPerEm,scale:i}}hr(t,e){const i=e.endCount.length;let s=-1;for(let r=0;r<i;r++)if(t<=e.endCount[r]){s=r;break}return s===-1||t<e.startCount[s]?0:Dt(e,t,s)}ar(t,e){const i=e.groups.length/3;for(let s=0;s<i;s++){const r=e.groups[3*s],h=e.groups[3*s+1],a=e.groups[3*s+2];if(t>=r&&t<=h)return a+(t-r)}return 0}}class Ye{constructor(){o(this,"dr");this.dr=new Yt}pr(t,e,i){let s=0;const r=this.dr.ur(i,e),h=r.lineHeight;for(const a of t){const l=this.dr.cr(i,a);if(l===0)continue;const u=this.dr.lr(i,l)*r.scale;s=Math.max(s,u)}return{width:Math.ceil(s),height:Math.ceil(h)}}}class Be{constructor(){o(this,"vr");this.vr=new Yt}gr(t,e){const i=[],s=new Map;return t.forEach((r,h)=>{const a=r.codePointAt(0)||0,l={character:r,unicode:a,color:this.mr(h),glyphData:this._r(e,r)};i.push(l),s.set(r,l)}),{array:i,map:s}}mr(t){return[t%256/255,Math.floor(t/256)%256/255,0]}_r(t,e){const i=e.codePointAt(0)||0,s=this.vr.nr(t,i);if(s===0)return null;const r=this.vr.lr(t,s),h=lt.T.glyf.Ni(t,s);return h?{...h,advanceWidth:r}:null}}class V extends q{constructor(e,i=16){super();o(this,"yr");o(this,"wr",[]);o(this,"Ar",new Map);o(this,"br",16);o(this,"Cr",{width:0,height:0});o(this,"Mr");o(this,"Fr");o(this,"$r");o(this,"Pr");o(this,"Tr");o(this,"Sr",!1);this.br=i,this.Fr=new Ne,this.$r=new De(e),this.Pr=new Ye,this.Tr=new Be}async Er(e){if(this.Sr)return;const i=e||"data:font/woff;base64,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",s=await this.kr(i);await this.Rr(s)}Dr(e){if(e===void 0)return this.br;this.br=e,this.Lr()}Lr(){const e=this.wr.map(i=>i.character);this.Cr=this.Pr.pr(e,this.br,this.yr),this.$r.sr(this.wr,this.Cr,this.br,this.yr)}async Or(e){try{const i=await this.kr(e);await this.Rr(i)}catch(i){throw new T(`Failed to load font: ${i instanceof Error?i.message:"Unknown error"}`,{originalError:i})}}async kr(e){const i=await fetch(e);if(!i.ok)throw new T(`Failed to load font file: ${i.status} ${i.statusText}`);return i.arrayBuffer()}async Rr(e){await this.zr(e);const i=lt.parse(e);if(!i||i.length===0)throw new Error("Failed to parse font file");this.yr=i[0],await this.Hr()}async zr(e){this.Mr&&document.fonts.delete(this.Mr);const i=Date.now();this.Mr=new FontFace(`CustomFont_${i}`,e),await this.Mr.load(),document.fonts.add(this.Mr)}async Hr(){const e=this.Fr.Yi(this.yr),{array:i,map:s}=this.Tr.gr(e,this.yr);this.wr=i,this.Ar=s,this.Lr(),this.Sr=!0}Br(e){const i=this.Ar.get(e);return i?i.color:[0,0,0]}Ir(e){return Array.from(e).map(i=>{const s=this.Ar.get(i);return s?s.color:[0,0,0]})}dispose(){this.$r.Ss(),this.Mr&&document.fonts.delete(this.Mr),super.dispose()}get Gr(){return this.Sr}get fontFramebuffer(){return this.$r.framebuffer}get characterMap(){return this.Ar}get characters(){return this.wr}get textureColumns(){return this.$r.columns}get textureRows(){return this.$r.rows}get maxGlyphDimensions(){return this.Cr}get fontSize(){return this.br}get font(){return this.yr}}class Bt{constructor(t,e,i){o(this,"Nr");o(this,"tr");o(this,"M");o(this,"F");o(this,"jr");o(this,"Qr");o(this,"Xr");o(this,"Yr");o(this,"Kr");o(this,"Wr",!1);o(this,"Zr",new Set);this.Xr=t,this.Yr=e,this.Kr=i,this.reset()}qr(){if(this.M=this.Nr*this.Yr,this.F=this.tr*this.Kr,this.jr=Math.floor((this.Xr.width-this.M)/2),this.Qr=Math.floor((this.Xr.height-this.F)/2),this.Zr.size>0)for(const t of this.Zr)t()}Vr(t){this.Zr.add(t)}Jr(t){this.Zr.delete(t)}reset(){this.Wr||(this.Nr=Math.floor(this.Xr.width/this.Yr),this.tr=Math.floor(this.Xr.height/this.Kr)),this.qr()}tn(t,e){this.Yr=t,this.Kr=e,this.reset()}get cellWidth(){return this.Yr}get cellHeight(){return this.Kr}get cols(){return this.Nr}set cols(t){this.Wr=!0,this.Nr=Math.max(1,Math.floor(t)),typeof this.tr!="number"&&(this.tr=Math.max(1,Math.floor(this.Xr.height/this.Kr))),this.qr()}get rows(){return this.tr}set rows(t){this.Wr=!0,this.tr=Math.max(1,Math.floor(t)),typeof this.Nr!="number"&&(this.Nr=Math.max(1,Math.floor(this.Xr.width/this.Yr))),this.qr()}get width(){return this.M}get height(){return this.F}get offsetX(){return this.jr}get offsetY(){return this.Qr}responsive(){this.Wr=!1}sn(t,e){const i=this.Xr.getBoundingClientRect(),s=t-i.left,r=e-i.top,h=this.Xr.width/i.width,a=r*(this.Xr.height/i.height),l=s*h-this.jr,u=a-this.Qr,c=Math.floor(l/this.Yr),f=Math.floor(u/this.Kr);return c>=0&&c<this.Nr&&f>=0&&f<this.tr?{x:c-Math.floor((this.Nr-1)/2),y:f-Math.floor(this.tr/2)}:{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY}}Ss(){this.Zr.clear()}}function ct(n){return parseInt(n,16)}const ze=/^rgba?\(([^)]+)\)$/i;function D(n){return n=Math.round(n),Number.isNaN(n)?0:L(n,0,255)}function zt(n,t=!1){if(!n)return null;const e=n.trim().toLowerCase();if(!e)return null;let i=null;return e.startsWith("rgb")&&(i=function(s){const r=ze.exec(s.trim());if(!r)return null;const h=r[1].split(",").map(f=>f.trim());if(h.length<3)return null;const a=D(parseFloat(h[0])),l=D(parseFloat(h[1])),u=D(parseFloat(h[2]));let c=255;if(h[3]!==void 0){const f=h[3].trim();let g=parseFloat(f);f.endsWith("%")&&(g/=100),c=255*L(g,0,1)}return[a,l,u,Math.round(c)]}(e)),i&&(t||i[3]!==0)?i:null}class kt{constructor(t={}){o(this,"Xr");o(this,"en",null);o(this,"rn",!1);o(this,"nn");o(this,"hn",null);o(this,"an",!0);o(this,"$",null);if(this.rn=t.overlay??!1,t.gl)this.hn=t.gl,this.Xr=t.gl.canvas,this.nn=!1,this.an=!1;else if(this.rn&&t.canvas)this.en=t.canvas,this.Xr=this.cn(),this.nn=!0,this.ln();else if(t.canvas){if(t.canvas instanceof HTMLVideoElement)throw new T("Video elements are only supported in overlay mode.");this.Xr=t.canvas,this.nn=!1}else this.Xr=this.un(t.width,t.height),this.nn=!0;this.Xr.style.imageRendering="pixelated"}un(t,e){const i=document.createElement("canvas");return i.className="textmodeCanvas",i.style.imageRendering="pixelated",i.width=t||800,i.height=e||600,document.body.appendChild(i),i}cn(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const e=this.en.getBoundingClientRect();let i=Math.round(e.width),s=Math.round(e.height);if(this.en instanceof HTMLVideoElement){const a=this.en;(i===0||s===0)&&a.videoWidth>0&&a.videoHeight>0&&(i=a.videoWidth,s=a.videoHeight)}t.width=i,t.height=s,t.style.position="absolute",t.style.pointerEvents="none";const r=window.getComputedStyle(this.en);let h=parseInt(r.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=(h+1).toString(),t}ln(){var t;this.fn(),(t=this.en.parentNode)==null||t.insertBefore(this.Xr,this.en.nextSibling)}dn(){const t=[];return this.rn&&this.en instanceof HTMLElement&&(t.push(this.en),this.en.parentElement&&t.push(this.en.parentElement)),this.Xr.parentElement&&t.push(this.Xr.parentElement),t.push(this.Xr),t.push(document.body),t.push(document.documentElement),t}pn(){const t=this.dn();for(const e of t){if(!e)continue;const i=zt(window.getComputedStyle(e).backgroundColor);if(i)return i}return[255,255,255,255]}fn(){if(!this.en)return;const t=this.en.getBoundingClientRect();let e=this.en.offsetParent;if(e&&e!==document.body){const i=e.getBoundingClientRect();this.Xr.style.top=t.top-i.top+"px",this.Xr.style.left=t.left-i.left+"px"}else this.Xr.style.top=t.top+window.scrollY+"px",this.Xr.style.left=t.left+window.scrollX+"px"}vn(t,e){if(this.rn){const i=this.en.getBoundingClientRect();this.Xr.width=Math.round(i.width),this.Xr.height=Math.round(i.height),this.fn()}else this.Xr.width=t??this.Xr.width,this.Xr.height=e??this.Xr.height}gn(){if(this.hn)return this.hn;const t=this.Xr.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!0,stencil:!1,powerPreference:"high-performance"});if(!t)throw new T("`textmode.js` requires WebGL2 support.");return this.$=t,t}Ss(){if(!this.an)return;const t=this.$??this.hn;if(t){const e=t.getExtension("WEBGL_lose_context");e==null||e.loseContext()}this.nn&&this.Xr.parentNode&&this.Xr.parentNode.removeChild(this.Xr)}get canvas(){return this.Xr}get targetCanvas(){return this.en}get width(){return this.Xr.width}get height(){return this.Xr.height}get ownsContext(){return this.an}}class x{constructor(t,e,i,s){o(this,"mn");o(this,"_n");o(this,"r");o(this,"g");o(this,"b");o(this,"a");this.r=D(t),this.g=D(e),this.b=D(i),this.a=D(s)}static yn(t,e,i,s){if(x.wn(t))return t;if(Array.isArray(t)){if(t.length<3)throw new Error("Component tuples must include at least RGB values.");const[r,h,a]=t,l=t.length===4?t[3]:255;return x.An(r,h,a,l)}if(typeof t=="string"){const r=t.trim();if(r.length===0)throw new Error("Color strings cannot be empty.");const h=zt(r,!0);return h?x.An(...h):x.bn(r)}if(typeof t=="number")return typeof e=="number"&&typeof i=="number"?x.An(t,e,i,s??255):typeof e=="number"?x.Cn(t,e):x.Cn(t,s??255);throw new Error("Unsupported color input passed to TextmodeColor.$from.")}static An(t,e,i,s=255){return new x(t,e,i,s)}static Cn(t,e=255){return new x(t,t,t,e)}static bn(t){return new x(...function(e){const i=e.trim().replace(/^#|0x/gi,"");if(!/^[0-9A-Fa-f]+$/.test(i))throw new Error(`Invalid hex color: ${e}`);const s=(r=i).length===3||r.length===4?r.split("").map(h=>h+h).join(""):r;var r;if(s.length!==6&&s.length!==8)throw new Error(`Invalid hex color: ${e}`);return[ct(s.slice(0,2)),ct(s.slice(2,4)),ct(s.slice(4,6)),s.length===8?ct(s.slice(6,8)):255]}(t))}static xn(t,e,i,s){return new x(Math.round(255*t),Math.round(255*e),Math.round(255*i),Math.round(255*s))}get rgb(){return[this.r,this.g,this.b]}get rgba(){return this.mn||(this.mn=[this.r,this.g,this.b,this.a]),[...this.mn]}get normalized(){return this._n||(this._n=[this.r/255,this.g/255,this.b/255,this.a/255]),[...this._n]}withAlpha(t){return new x(this.r,this.g,this.b,t)}static wn(t){return t instanceof x}}class Tt extends q{constructor(e,i,s,r,h,a,l,u){super();o(this,"$");o(this,"R");o(this,"Mn");o(this,"Fn");o(this,"$n");o(this,"M");o(this,"F");o(this,"D",null);o(this,"Pn",null);o(this,"Tn","brightness");o(this,"Sn",null);o(this,"Un");o(this,"Rt",0);o(this,"Gt",0);o(this,"Nt",0);o(this,"Dt",0);o(this,"En","sampled");o(this,"kn","fixed");o(this,"Xt",[1,1,1,1]);o(this,"Yt",[0,0,0,1]);o(this,"Rn",[0,0,0,1]);o(this,"Dn",[[.1,0,0]]);o(this,"Qt",null);this.$=e,this.R=i,this.Mn=s,this.Un=r,this.Fn=h,this.$n=a;const{width:c,height:f}=function(g,p,m,d){const v=Math.min(m/g,d/p);return{width:Math.max(1,Math.floor(g*v)),height:Math.max(1,Math.floor(p*v)),scale:v}}(h,a,l,u);this.M=c,this.F=f}conversionMode(e){return this.Tn=e,this.Sn=null,this.D=null,this}dispose(){this.Mn&&(this.$.deleteTexture(this.Mn),this.Mn=null),super.dispose()}invert(e=!0){return this.Rt=e?1:0,this.D=null,this}flipX(e=!0){return this.Gt=e?1:0,this.D=null,this}flipY(e=!0){return this.Nt=e?1:0,this.D=null,this}charRotation(e){return this.Dt=Mt(e),this.D=null,this}charColorMode(e){return this.En=e,this.D=null,this}cellColorMode(e){return this.kn=e,this.D=null,this}charColor(e,i,s,r){return this.Ln(this.Xt,e,i,s,r),this.D=null,this}cellColor(e,i,s,r){return this.Ln(this.Yt,e,i,s,r),this.D=null,this}background(e,i,s,r){return this.Ln(this.Rn,e,i,s,r),this.D=null,this}characters(e){return this.Qt=e,this.On(e),this.D=null,this}Si(e){this.Pn!==e&&(this.Pn=e,this.Qt&&this.On(this.Qt),this.D=null)}get texture(){return this.Mn}get width(){return this.M}get height(){return this.F}get originalWidth(){return this.Fn}get originalHeight(){return this.$n}V(){return this.D||this.J(),this.D}zn(){}Hn(){return this.Mn}J(){this.zn();const e=this.Bn(),i=this.In(),s=this.Un.Gn(this.Tn,i),r=e.createUniforms(i);this.D=this.R.materialManager.st(s,r)}Ln(e,i,s,r,h){const a=x.yn(i,s,r,h);st(e,a.r,a.g,a.b,a.a)}On(e){if(!this.Pn)return;const i=this.Pn.Ir(e).filter(s=>Array.isArray(s)).slice(0,255);this.Dn=i.length>0?i:this.Dn}createBaseConversionUniforms(){return{u_image:this.Hn(),u_invert:!!this.Rt,u_flipX:!!this.Gt,u_flipY:!!this.Nt,u_charRotation:this.Dt,u_charColorFixed:this.En==="fixed",u_charColor:this.Xt,u_cellColorFixed:this.kn==="fixed",u_cellColor:this.Yt,u_backgroundColor:this.Rn,u_charCount:this.Dn.length,u_charList:this.Dn}}Bn(){if(this.Sn&&this.Sn.id===this.Tn)return this.Sn;const e=this.Un.Nn(this.Tn);if(!e)throw new Error(`[textmode.js] Conversion mode "${this.Tn}" is not registered. If this mode is provided by an add-on, make sure its plugin is installed before loading sources.`);return this.Sn=e,e}In(){if(!this.Pn)throw new Error("[textmode.js] Cannot create conversion context: no active font set. Ensure $setActiveFont() is called before rendering.");return{renderer:this.R,gl:this.$,font:this.Pn,source:this}}}class Q extends Tt{constructor(t,e,i,s,r,h,a,l){super(t,e,i,s,r,h,a,l)}static jn(t,e,i,s,r){const h=t.context,a=At(h,i),{width:l,height:u}=yt(i);return new Q(h,t,a,e,l,u,s,r)}}class Ht{constructor(t=60){o(this,"Qn");o(this,"Xn");o(this,"Yn",null);o(this,"Kn",0);o(this,"Wn",!0);o(this,"Zn",0);o(this,"qn",0);o(this,"Vn",[]);o(this,"Jn",10);o(this,"th",0);o(this,"sh",0);o(this,"eh",-1);this.Xn=t,this.Qn=1e3/t}ih(t){if(!this.Wn)return;this.eh===-1&&(this.eh=performance.now()),this.Kn=performance.now();const e=i=>{if(!this.Wn)return void(this.Yn=null);const s=i-this.Kn;s>=this.Qn&&(t(),this.Kn=i-s%this.Qn),this.Wn&&(this.Yn=requestAnimationFrame(e))};this.Yn=requestAnimationFrame(e)}rh(){this.Yn&&(cancelAnimationFrame(this.Yn),this.Yn=null)}nh(){this.Wn&&(this.Wn=!1,this.rh())}hh(t){this.Wn||(this.Wn=!0,this.ih(t))}oh(t,e){if(t===void 0)return this.Zn;this.Xn=t,this.Qn=1e3/t,this.Wn&&e&&(this.rh(),this.ih(e))}ah(){const t=performance.now();if(this.qn>0){const e=t-this.qn;this.th=e,this.Vn.push(e),this.Vn.length>this.Jn&&this.Vn.shift();const i=this.Vn.reduce((s,r)=>s+r,0)/this.Vn.length;this.Zn=1e3/i}this.qn=t}get uh(){return this.Wn}get fh(){return this.Zn}get dh(){return this.Xn}set dh(t){this.Xn=t,this.Qn=1e3/t}get ph(){return this.sh}set ph(t){this.sh=t}gh(){this.sh++}get mh(){return this.eh===-1?0:performance.now()-this.eh}set mh(t){this.eh=performance.now()-t}get _h(){return this.mh/1e3}set _h(t){this.mh=1e3*t}get yh(){return this.th}}function Gt(n,t,e){return n?n.sn(t,e):{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY}}class Vt{constructor(t,e){o(this,"Xr");o(this,"wh");o(this,"Ah",{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY});o(this,"bh",{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY});o(this,"Ch",null);o(this,"xh",0);o(this,"Mh");o(this,"Fh");o(this,"$h");o(this,"Ph");o(this,"Th");o(this,"Sh");o(this,"Eh",!1);o(this,"kh");o(this,"Rh");o(this,"Dh");o(this,"Lh");o(this,"Oh");this.Xr=t,this.wh=e}zh(t){const e=performance.now()+Math.max(0,t);e>this.xh&&(this.xh=e)}Hh(){return performance.now()<this.xh}Bh(t){const e=this.Xr.canvas;e.style.cursor=t==null||t===""?"":t}Ih(){if(this.Eh)return;const t=this.Xr.canvas;this.Mh=e=>{this.Gh(e),this.Nh(e)},this.Fh=()=>{this.bh={...this.Ah},this.Ah.x=Number.NEGATIVE_INFINITY,this.Ah.y=Number.NEGATIVE_INFINITY,this.Ch=null},this.$h=e=>{this.Gh(e),this.jh(e)},this.Ph=e=>{this.Gh(e),this.Qh(e)},this.Th=e=>{this.Gh(e),this.Xh(e)},this.Sh=e=>{this.Gh(e),this.Yh(e)},t.addEventListener("mousemove",this.Mh,{passive:!0}),t.addEventListener("mouseleave",this.Fh,{passive:!0}),t.addEventListener("mousedown",this.$h,{passive:!0}),t.addEventListener("mouseup",this.Ph,{passive:!0}),t.addEventListener("click",this.Th,{passive:!0}),t.addEventListener("wheel",this.Sh,{passive:!1}),this.Eh=!0}Kh(){if(!this.Eh)return;const t=this.Xr.canvas;t.removeEventListener("mousemove",this.Mh),t.removeEventListener("mouseleave",this.Fh),t.removeEventListener("mousedown",this.$h),t.removeEventListener("mouseup",this.Ph),t.removeEventListener("click",this.Th),t.removeEventListener("wheel",this.Sh),this.Eh=!1}Wh(){if(this.Eh)try{if(this.Ch){const t=new MouseEvent("mousemove",{clientX:this.Ch.x,clientY:this.Ch.y,bubbles:!1,cancelable:!1});this.Gh(t)}}catch{this.Ah.x=Number.NEGATIVE_INFINITY,this.Ah.y=Number.NEGATIVE_INFINITY}}Zh(t){this.kh=t}qh(t){this.Rh=t}Vh(t){this.Dh=t}Jh(t){this.Lh=t}so(t){this.Oh=t}eo(){return{x:this.Ah.x,y:this.Ah.y}}io(t,e={}){return{position:{...this.Ah},previousPosition:{...this.bh},originalEvent:t,...e}}Nh(t){this.Lh&&!this.Hh()&&this.Lh(this.io(t))}jh(t){this.Rh&&!this.Hh()&&this.Rh(this.io(t,{button:t.button}))}Qh(t){this.Dh&&!this.Hh()&&this.Dh(this.io(t,{button:t.button}))}Xh(t){this.kh&&!this.Hh()&&this.kh(this.io(t,{button:t.button}))}Yh(t){this.Oh&&!this.Hh()&&this.Oh(this.io(t,{delta:{x:t.deltaX,y:t.deltaY}}))}Gh(t){const e=this.wh();this.bh={...this.Ah},this.Ch={x:t.clientX,y:t.clientY};const i=Gt(e,t.clientX,t.clientY);this.Ah.x=i.x,this.Ah.y=i.y}}const ke=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:Vt},Symbol.toStringTag,{value:"Module"}));class jt{constructor(){o(this,"ro",new Map);o(this,"no",null);o(this,"ho",null);o(this,"oo");o(this,"ao");o(this,"Eh",!1);o(this,"co");o(this,"lo");o(this,"uo",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}Ih(){this.Eh||(this.oo=t=>{this.fo(t)},this.ao=t=>{this.do(t)},window.addEventListener("keydown",this.oo,{passive:!1}),window.addEventListener("keyup",this.ao,{passive:!1}),this.Eh=!0)}Kh(){this.Eh&&(window.removeEventListener("keydown",this.oo),window.removeEventListener("keyup",this.ao),this.Eh=!1,this.ro.clear(),this.no=null,this.ho=null)}qh(t){this.co=t}Vh(t){this.lo=t}po(t){const e=this.vo(t),i=this.ro.get(t)||this.ro.get(e);return(i==null?void 0:i.isPressed)||!1}mo(){return this.no}_o(){return this.ho}yo(){const t=[];for(const[e,i]of this.ro)i.isPressed&&t.push(e);return t}wo(){return{ctrl:this.po("Control"),shift:this.po("Shift"),alt:this.po("Alt"),meta:this.po("Meta")}}Ao(){this.ro.clear(),this.no=null,this.ho=null}fo(t){const e=t.key,i=Date.now();this.ro.has(e)||this.ro.set(e,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const s=this.ro.get(e);s.isPressed||(s.isPressed=!0,s.lastPressTime=i,this.no=e,this.co&&this.co(this.io(e,!0,t)))}io(t,e,i){return{key:t,keyCode:i.keyCode,ctrlKey:i.ctrlKey,shiftKey:i.shiftKey,altKey:i.altKey,metaKey:i.metaKey,isPressed:e,originalEvent:i}}do(t){const e=t.key,i=Date.now();this.ro.has(e)||this.ro.set(e,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const s=this.ro.get(e);s.isPressed=!1,s.lastReleaseTime=i,this.ho=e,this.lo&&this.lo(this.io(e,!1,t))}vo(t){return this.uo[t]||t.toLowerCase()}}const He=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:jt},Symbol.toStringTag,{value:"Module"}));class Wt{constructor(t,e,i){o(this,"Xr");o(this,"bo");o(this,"wh");o(this,"Co",new Map);o(this,"xo",new Map);o(this,"Mo",new Map);o(this,"Fo",null);o(this,"$o");o(this,"Po");o(this,"To");o(this,"So");o(this,"Uo");o(this,"Eo");o(this,"Eh",!1);o(this,"ko");o(this,"Ro");o(this,"Do");o(this,"Lo");o(this,"Oo");o(this,"zo");o(this,"Ho");o(this,"Bo");o(this,"Io");o(this,"Go");o(this,"No",320);o(this,"jo",350);o(this,"Qo",10);o(this,"Xo",550);o(this,"Yo",14);o(this,"Ko",48);o(this,"Wo",650);o(this,"Zo",.02);o(this,"qo",2);o(this,"Vo",600);o(this,"Jo",0);o(this,"ta",null);this.Xr=t,this.wh=e,this.bo=i;const s=this.Xr.canvas;this.$o=s.style.touchAction,this.Po=s.style.userSelect,s.style.touchAction||(s.style.touchAction="none"),s.style.userSelect||(s.style.userSelect="none")}Ih(){if(this.Eh)return;const t=this.Xr.canvas;this.To=e=>{this.sa(e)},this.So=e=>{this.ea(e)},this.Uo=e=>{this.ia(e)},this.Eo=e=>{this.ra(e)},t.addEventListener("touchstart",this.To,{passive:!1}),t.addEventListener("touchmove",this.So,{passive:!1}),t.addEventListener("touchend",this.Uo,{passive:!1}),t.addEventListener("touchcancel",this.Eo,{passive:!1}),this.Eh=!0}Kh(){if(!this.Eh)return;const t=this.Xr.canvas;t.removeEventListener("touchstart",this.To),t.removeEventListener("touchmove",this.So),t.removeEventListener("touchend",this.Uo),t.removeEventListener("touchcancel",this.Eo),this.Eh=!1,this.Fo=null,this.Co.clear(),this.xo.clear(),this.Mo.forEach(e=>{e.longPressTimer!==null&&window.clearTimeout(e.longPressTimer)}),this.Mo.clear(),this.ta=null,this.Jo=0,t.style.touchAction=this.$o,t.style.userSelect=this.Po}Wh(){if(!this.wh()||this.Co.size===0)return;const t=new Map;for(const e of this.Co.values()){const i=this.na(e.clientX,e.clientY,e.id,e);t.set(e.id,i)}this.Co=t}ha(){return Array.from(this.Co.values()).map(t=>({...t}))}oa(t){this.ko=t}Jh(t){this.Ro=t}aa(t){this.Do=t}ca(t){this.Lo=t}la(t){this.Oo=t}ua(t){this.zo=t}fa(t){this.Ho=t}da(t){this.Bo=t}pa(t){this.Io=t}va(t){this.Go=t}sa(t){var s;if(!this.wh())return;t.preventDefault(),(s=this.bo)==null||s.zh(this.Vo);const e=performance.now(),i=this.ga(t.changedTouches);for(const r of i){const h=this.Co.get(r.id);h&&this.xo.set(r.id,this.ma(h)),this.Co.set(r.id,r);const a={id:r.id,startPosition:r,lastPosition:r,startTime:e,lastTime:e,longPressTimer:null,longPressFired:!1};this.Ho&&(a.longPressTimer=window.setTimeout(()=>{const l=this.Co.get(r.id);l&&(a.longPressFired=!0,this.Ho({touch:this.ma(l),duration:performance.now()-a.startTime,originalEvent:t}))},this.Xo)),this.Mo.set(r.id,a),this.ko&&this.ko(this._a(r,t,void 0,e))}this.Co.size===2&&this.ya()}ea(t){var s;if(!this.wh())return;t.preventDefault(),(s=this.bo)==null||s.zh(this.Vo);const e=performance.now(),i=this.ga(t.changedTouches);for(const r of i){const h=this.Co.get(r.id),a=h?this.ma(h):void 0;a&&this.xo.set(r.id,a),this.Co.set(r.id,r);const l=this.Mo.get(r.id);l&&(l.lastPosition=r,l.lastTime=e,a)&&tt(a.clientX,a.clientY,r.clientX,r.clientY)>this.Yo&&l.longPressTimer!==null&&(window.clearTimeout(l.longPressTimer),l.longPressTimer=null),this.Ro&&this.Ro(this._a(r,t,a,e))}this.Co.size===2?this.wa(t):this.Fo=null}ia(t){if(!this.wh())return;t.preventDefault();const e=performance.now(),i=this.ga(t.changedTouches);for(const s of i){const r=this.Co.get(s.id),h=r?this.ma(r):void 0,a=this.Mo.get(s.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Do&&this.Do(this._a(s,t,h,e)),a&&this.ba(a,t),this.Mo.delete(s.id),this.xo.delete(s.id),this.Co.delete(s.id)}this.Co.size<2&&(this.Fo=null)}ra(t){if(!this.wh())return;t.preventDefault();const e=performance.now(),i=this.ga(t.changedTouches);for(const s of i){const r=this.Co.get(s.id),h=r?this.ma(r):void 0,a=this.Mo.get(s.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Lo&&this.Lo(this._a(s,t,h,e)),this.Mo.delete(s.id),this.xo.delete(s.id),this.Co.delete(s.id)}this.Co.size<2&&(this.Fo=null)}ga(t){const e=[];for(let i=0;i<t.length;i+=1){const s=t.item(i);s&&e.push(this.Ca(s))}return e}Ca(t){return this.na(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}na(t,e,i,s){const r=Gt(this.wh(),t,e);return{id:i,x:r.x,y:r.y,clientX:t,clientY:e,pressure:s.pressure,radiusX:s.radiusX,radiusY:s.radiusY,rotationAngle:s.rotationAngle}}_a(t,e,i,s){const r=this.Mo.get(t.id),h=Array.from(this.xo.values()).map(u=>this.ma(u)),a=Array.from(this.Co.values()).map(u=>this.ma(u)),l=this.ga(e.changedTouches);return{touch:this.ma(t),previousTouch:i?this.ma(i):void 0,touches:a,previousTouches:h,changedTouches:l,deltaTime:r?s-r.lastTime:0,originalEvent:e}}ya(){if(this.Co.size!==2)return void(this.Fo=null);const t=Array.from(this.Co.values()),[e,i]=t,s=tt(e.x,e.y,i.x,i.y),r=Ft(e.clientX,e.clientY,i.clientX,i.clientY);this.Fo={ids:[e.id,i.id],initialDistance:Math.max(s,1e-4),initialAngle:r,lastScale:1,lastRotation:0}}wa(t){if(this.Fo||this.ya(),!this.Fo)return;const[e,i]=this.Fo.ids,s=this.Co.get(e),r=this.Co.get(i);if(!s||!r)return;const h=tt(s.x,s.y,r.x,r.y)/this.Fo.initialDistance,a=h-this.Fo.lastScale;this.Io&&Math.abs(a)>this.Zo&&(this.Io({touches:[this.ma(s),this.ma(r)],scale:h,deltaScale:a,center:this.xa(s,r),originalEvent:t}),this.Fo.lastScale=h);let l=Ft(s.clientX,s.clientY,r.clientX,r.clientY)-this.Fo.initialAngle;l=(l+180)%360-180;const u=l-this.Fo.lastRotation;this.Go&&Math.abs(u)>this.qo&&(this.Go({touches:[this.ma(s),this.ma(r)],rotation:l,deltaRotation:u,center:this.xa(s,r),originalEvent:t}),this.Fo.lastRotation=l)}xa(t,e){const i=(t.clientX+e.clientX)/2,s=(t.clientY+e.clientY)/2,r=this.na(i,s,-1,{id:-1,x:-1,y:-1,clientX:i,clientY:s});return{x:r.x,y:r.y}}ba(t,e){const i=performance.now(),s=i-t.startTime,r=t.lastPosition.clientX-t.startPosition.clientX,h=t.lastPosition.clientY-t.startPosition.clientY,a=Math.hypot(r,h);if(!t.longPressFired&&s<=this.No&&a<=this.Qo)this.Ma(t.lastPosition,i)&&this.zo?this.zo({touch:this.ma(t.lastPosition),taps:2,originalEvent:e}):this.Oo&&this.Oo({touch:this.ma(t.lastPosition),taps:1,originalEvent:e});else if(!t.longPressFired&&s<=this.Wo&&a>=this.Ko){const l=Math.max(a,1e-4),u={x:r/l,y:h/l},c={x:r/s,y:h/s};this.Bo&&this.Bo({touch:this.ma(t.lastPosition),direction:u,distance:l,velocity:c,originalEvent:e})}this.Jo=i,this.ta=this.ma(t.lastPosition)}Ma(t,e){return!this.ta||e-this.Jo>this.jo?!1:tt(t.clientX,t.clientY,this.ta.clientX,this.ta.clientY)<=this.Qo}ma(t){return{...t}}}const Ge=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:Wt},Symbol.toStringTag,{value:"Module"}));class Z extends Tt{constructor(e,i,s,r,h,a,l,u,c){super(e,i,s,r,h,a,l,u);o(this,"Fa");this.Fa=c}static $a(e,i,s,r,h){const a=e.context,l=At(a,s),{width:u,height:c}=yt(s);return new Z(a,e,l,i,u,c,r,h,s)}Pa(){this.Fa instanceof HTMLVideoElement?this.Fa.readyState>=this.Fa.HAVE_CURRENT_DATA&&et(this.$,this.Mn,this.Fa):et(this.$,this.Mn,this.Fa)}V(){return this.D=null,super.V()}zn(){this.Pa()}get source(){return this.Fa}}class ut extends Z{constructor(t,e,i,s,r,h,a,l,u){super(t,e,i,s,h,a,l,u,r)}dispose(){super.dispose(),this.Ta.pause(),this.Ta.src="",this.Ta.load()}Sa(){this.Pa()}static async jn(t,e,i,s,r){const h=t.context,a=document.createElement("video");a.crossOrigin="anonymous",a.loop=!0,a.muted=!0,a.playsInline=!0,await new Promise((f,g)=>{a.addEventListener("loadedmetadata",()=>f(),{once:!0}),a.addEventListener("error",p=>{var d;const m=p.target;g(new Error(`Failed to load video: ${((d=m.error)==null?void 0:d.message)||"Unknown error"}`))},{once:!0}),a.src=i});const l=At(h,a,h.LINEAR,h.LINEAR,h.CLAMP_TO_EDGE,h.CLAMP_TO_EDGE),{width:u,height:c}=yt(a);return new ut(h,t,l,e,a,u,c,s,r)}async play(){await this.Ta.play()}pause(){this.Ta.pause()}stop(){this.Ta.pause(),this.Ta.currentTime=0}speed(t){return this.Ta.playbackRate=t,this}loop(t=!0){return this.Ta.loop=t,this}time(t){return this.Ta.currentTime=t,this}volume(t){return this.Ta.volume=L(t,0,1),this}get videoElement(){return this.Ta}get currentTime(){return this.Ta.currentTime}get duration(){return this.Ta.duration}get isPlaying(){return!this.Ta.paused&&!this.Ta.ended}get Ta(){return this.Fa}}async function ft(n){if(n.startsWith("./")||n.startsWith("../")||n.endsWith(".vert")||n.endsWith(".frag")||n.endsWith(".glsl")){const t=await fetch(n);if(!t.ok)throw new Error(`Failed to load shader from ${n}: ${t.statusText}`);return await t.text()}return n}const Ve=n=>class extends n{rotate(t=0,e=0,i=0){this.R.state.Jt(t),this.R.state.ts(e),this.R.state.ss(i)}rotateX(t){if(t===void 0)return J(this.R.state.rotationX);this.R.state.Jt(t)}rotateY(t){if(t===void 0)return J(this.R.state.rotationY);this.R.state.ts(t)}rotateZ(t){if(t===void 0)return J(this.R.state.rotationZ);this.R.state.ss(t)}translate(t=0,e=0,i=0){this.R.state.es(t,e,i)}translateX(t){if(t===void 0)return this.R.state.translationX;this.R.state.es(t,0,0)}translateY(t){if(t===void 0)return this.R.state.translationY;this.R.state.es(0,t,0)}translateZ(t){if(t===void 0)return this.R.state.translationZ;this.R.state.es(0,0,t)}ortho(){this.R.state.ws(!0)}push(){this.R.state.K()}pop(){this.R.state.W()}color(t,e,i,s){return x.yn(t,e,i,s)}rect(t=1,e=1){this.R.ki(t,e)}point(){this.R.ki(1,1)}line(t,e,i,s){this.R.Ri(t,e,i,s)}lineWeight(t){if(t===void 0)return this.R.state.lineWeight;this.R.state.qt(t)}background(t,e,i,s=255){if(t===void 0){const[h,a,l,u]=this.R.state.canvasBackgroundColor;return x.xn(h,a,l,u)}const r=x.yn(t,e,i,s);this.R.Bi(r.r,r.g,r.b,r.a)}char(t){if(t===void 0)return this.R.state.characterString;let e;typeof t=="number"?e=this.font.characters[t].character:e=t;const i=Array.from(e);if(i.length===0)throw new Error("char() requires at least one character.");const s=i[0];this.R.state.cs(this.font.Br(s)),this.R.state.ls(s)}Xt(t,e,i,s){if(t===void 0){const[h,a,l,u]=this.R.state.charColor;return x.xn(h,a,l,u)}const r=x.yn(t,e,i,s);this.R.state.us(r.r,r.g,r.b,r.a)}charColor(t,e,i,s){return this.Xt(t,e,i,s)}stroke(t,e,i,s){return this.Xt(t,e,i,s)}Yt(t,e,i,s){if(t===void 0){const[h,a,l,u]=this.R.state.cellColor;return x.xn(h,a,l,u)}const r=x.yn(t,e,i,s);this.R.state.fs(r.r,r.g,r.b,r.a)}cellColor(t,e,i,s){return this.Yt(t,e,i,s)}fill(t,e,i,s){return this.Yt(t,e,i,s)}flipX(t){if(t===void 0)return this.R.state.flipX;this.R.state.ds(t)}flipY(t){if(t===void 0)return this.R.state.flipY;this.R.state.ps(t)}charRotation(t){if(t===void 0)return 360*this.R.state.charRotation;this.R.state.gs(t)}invert(t){if(t===void 0)return this.R.state.invert;this.R.state.vs(t)}clear(){this.R.xe(0,0,0,0)}ellipse(t=1,e=1){this.R.Di(t/2,e/2)}triangle(t,e,i,s,r,h){this.R.Li(t,e,i,s,r,h)}bezierCurve(t,e,i,s,r,h,a,l){this.R.Oi(t,e,i,s,r,h,a,l)}arc(t,e,i,s){this.R.zi(t/2,e/2,i,s)}shader(t){this.R.Fi(t)}resetShader(){this.R.$i()}setUniform(t,e){this.R._t(t,e)}setUniforms(t){this.R.gt(t)}async createFilterShader(t){const e=await ft(t),i=this.R.Pi(e);return this.Ea(i),i}async createShader(t,e){const i=await ft(t),s=await ft(e),r=this.R.Mi(i,s);return this.Ea(r),r}createFramebuffer(t){const e=this.R.Hi(t.width??this.grid.cols,t.height??this.grid.rows,t.attachments??3);return this.Ea(e),e}image(t,e,i){this.R.Ti(t,e,i,this.font),t instanceof it&&this.R.Z()}async loadImage(t){const e=t,i=await new Promise((r,h)=>{const a=new Image;a.crossOrigin="anonymous",a.onload=()=>r(a),a.onerror=l=>h(l),a.src=e}),s=Q.jn(this.R,this.Un,i,this.grid.cols,this.grid.rows);return this.Ea(s),s}async loadVideo(t){const e=await ut.jn(this.R,this.Un,t,this.grid.cols,this.grid.rows);return this.Ea(e),e}createTexture(t){const e=Z.$a(this.R,this.Un,t,this.grid.cols,this.grid.rows);return this.Ea(e),e}},je=n=>class extends n{get frameCount(){return this.ka.ph}set frameCount(t){this.ka.ph=t}frameRate(t){return t===void 0?this.ka.fh:this.ka.oh(t,()=>this.Ra())}targetFrameRate(t){if(t===void 0)return this.ka.dh;this.ka.dh=t}noLoop(){this.ka.nh()}loop(){this.ka.hh(()=>this.Ra())}redraw(t=1){if(vt.m(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let e=0;e<t;e++)this.Ra()}isLooping(){return this.ka.uh}get millis(){return this.ka.mh}set millis(t){this.ka.mh=t}get secs(){return this.ka._h}set secs(t){this.ka._h=t}deltaTime(){return this.ka.yh}},We=n=>class extends n{constructor(...t){super(...t)}mouseClicked(t){this.bo.Zh(t)}mousePressed(t){this.bo.qh(t)}mouseReleased(t){this.bo.Vh(t)}mouseMoved(t){this.bo.Jh(t)}mouseScrolled(t){this.bo.so(t)}get mouse(){return this.bo.eo()}cursor(t){this.bo.Bh(t)}},Ke=n=>class extends n{constructor(...t){super(...t)}touchStarted(t){this.Da.oa(t)}touchMoved(t){this.Da.Jh(t)}touchEnded(t){this.Da.aa(t)}touchCancelled(t){this.Da.ca(t)}tap(t){this.Da.la(t)}doubleTap(t){this.Da.ua(t)}longPress(t){this.Da.fa(t)}swipe(t){this.Da.da(t)}pinch(t){this.Da.pa(t)}rotateGesture(t){this.Da.va(t)}get touches(){return this.Da.ha()}},Qe=n=>class extends n{constructor(...t){super(...t)}keyPressed(t){this.La.qh(t)}keyReleased(t){this.La.Vh(t)}isKeyPressed(t){return this.La.po(t)}get lastKeyPressed(){return this.La.mo()}get lastKeyReleased(){return this.La._o()}get pressedKeys(){return this.La.yo()}get modifierState(){return this.La.wo()}};class Kt{constructor(t){o(this,"Oa");o(this,"za",new Map);o(this,"Ha",[]);o(this,"Ba",new Map);o(this,"Ia",new Map);o(this,"Ga",new Map);o(this,"Na",new Map);o(this,"ja",new Map);o(this,"Qa",new Map);o(this,"Xa",new Map);o(this,"Ya",new Map);this.Oa=t}Ka(t){for(const e of t){if(this.za.has(e.name))return void console.warn(`[textmode.js] Plugin "${e.name}" is already installed.`);const i=this.Wa(e.name);try{const s=e.install(this.Oa,i);s instanceof Promise&&s.catch(r=>{console.error(`[textmode.js] Async plugin "${e.name}" installation error:`,r),this.Za(e.name)})}catch(s){throw this.Za(e.name),s}this.za.set(e.name,e),this.Ha.push(e.name)}}async qa(t){for(const e of t){if(this.za.has(e.name))return void console.warn(`[textmode.js] Plugin "${e.name}" is already installed.`);const i=this.Wa(e.name);try{await e.install(this.Oa,i)}catch(s){throw this.Za(e.name),s}this.za.set(e.name,e),this.Ha.push(e.name)}}async Va(t){const e=this.za.get(t);if(!e)return;const i=this.Wa(t);e.uninstall&&await e.uninstall(this.Oa,i),this.za.delete(t),this.Ha.splice(this.Ha.indexOf(t),1),this.Za(t)}Ja(){this.tc(this.Ba,t=>t())}sc(){this.tc(this.Ia,t=>t())}ec(t){this.tc(this.Ga,e=>e(t))}rc(t){this.tc(this.Na,e=>e(t))}nc(t){this.tc(this.ja,e=>e(t))}async hc(){await this.oc(this.Qa,t=>t())}async ac(){await this.oc(this.Xa,t=>t())}async cc(){const t=[...this.za.keys()];for(const e of t)await this.Va(e)}Wa(t){const e=this.Oa,i=this;return{get renderer(){return e.R},get canvas(){return e.Xr},get layerManager(){return e.layers},get font(){return e.layers.base.font},get grid(){return e.layers.base.grid},get drawFramebuffer(){return e.layers.base.drawFramebuffer},get asciiFramebuffer(){return e.layers.base.asciiFramebuffer},registerPreDrawHook:s=>i.lc(i.Ba,t,s),registerPostDrawHook:s=>i.lc(i.Ia,t,s),registerLayerDisposedHook:s=>i.lc(i.Ga,t,s),registerLayerPreRenderHook:s=>i.lc(i.Na,t,s),registerLayerPostRenderHook:s=>i.lc(i.ja,t,s),registerPreSetupHook:s=>i.lc(i.Qa,t,s),registerPostSetupHook:s=>i.lc(i.Xa,t,s),extendLayer:(s,r)=>{i.uc(t,s,r)},removeLayerExtension:s=>{i.fc(t,s)}}}lc(t,e,i){const s=t.get(e)??new Set;return s.add(i),t.set(e,s),()=>{const r=t.get(e);r&&(r.delete(i),r.size===0&&t.delete(e))}}Za(t){this.Ba.delete(t),this.Ia.delete(t),this.Ga.delete(t),this.Na.delete(t),this.ja.delete(t),this.Qa.delete(t),this.Xa.delete(t);const e=this.Ya.get(t);if(e){for(const i of e.keys())this.dc(i);this.Ya.delete(t)}}tc(t,e){for(const i of this.Ha){const s=t.get(i);s&&s.forEach(e)}}async oc(t,e){for(const i of this.Ha){const s=t.get(i);if(s)for(const r of s)await e(r)}}uc(t,e,i){let s=this.Ya.get(t);s||(s=new Map,this.Ya.set(t,s));for(const[r,h]of this.Ya)r!==t&&h.has(e)&&console.warn(`[textmode.js] Plugin "${t}" is overwriting layer method "${e}" previously added by plugin "${r}".`);s.set(e,i),this.vc(e,i)}fc(t,e){const i=this.Ya.get(t);if(!i)return;i.delete(e);let s=!1;for(const[r,h]of this.Ya)if(r!==t&&h.has(e)){s=!0;const a=h.get(e);this.vc(e,a);break}s||this.dc(e)}vc(t,e){const i=Object.getPrototypeOf(this.Oa.layers.base);Object.defineProperty(i,t,{value:e,writable:!0,configurable:!0,enumerable:!1})}dc(t){const e=Object.getPrototypeOf(this.Oa.layers.base),i=Object.getOwnPropertyDescriptor(e,t);i&&i.configurable&&delete e[t]}}const Ze=Object.freeze(Object.defineProperty({__proto__:null,TextmodePluginManager:Kt},Symbol.toStringTag,{value:"Module"})),$=`#version 300 es
7
+ `}static h(t){if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string")return`"${t}"`;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.length===0?"[]":t.length<=5?`[${t.map(e=>R.h(e)).join(", ")}]`:`[${t.slice(0,3).map(e=>R.h(e)).join(", ")}, ... +${t.length-3} more]`;if(typeof t=="object"){const e=Object.keys(t);return e.length===0?"{}":e.length<=3?`{ ${e.map(i=>`${i}: ${R.h(t[i])}`).join(", ")} }`:`{ ${e.slice(0,2).map(i=>`${i}: ${R.h(t[i])}`).join(", ")}, ... +${e.length-2} more }`}return String(t)}}var _=(n=>(n[n.SILENT=0]="SILENT",n[n.WARNING=1]="WARNING",n[n.ERROR=2]="ERROR",n[n.THROW=3]="THROW",n))(_||{});const B=class B{constructor(){o(this,"l",{globalLevel:3})}static u(){return B.o||(B.o=new B),B.o}v(t,e){const i="%c[textmode.js] Oops! (╯°□°)╯︵ Something went wrong in your code.",s="color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;";switch(this.l.globalLevel){case 0:return!1;case 1:return console.group(i,s),console.warn(R.i(t,e)),console.groupEnd(),!1;case 2:return console.group(i,s),console.error(R.i(t,e)),console.groupEnd(),!1;default:throw new R(t,e)}}m(t,e,i){return!!t||(this.v(e,i),!1)}_(t){this.l.globalLevel=t}};o(B,"o",null);let vt=B;const mt=vt.u();class K{constructor(){o(this,"A",new Set)}C(t){this.A.add(t)}dispose(){for(const t of this.A)t();this.A.clear()}}function H(n){return n*(Math.PI/180)}function J(n){return n*(180/Math.PI)}function Ft(n,t,e,i){return J(Math.atan2(i-t,e-n))}function tt(n,t,e,i){return Math.hypot(e-n,i-t)}function U(n,t,e){return Math.min(Math.max(n,t),e)}function Mt(n){return(n%360+360)%360/360}function Ct(n,t){n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,t)}function et(n,t,e){n.bindTexture(n.TEXTURE_2D,t),Ct(n,e),n.bindTexture(n.TEXTURE_2D,null)}function At(n,t,e=n.NEAREST,i=n.NEAREST,s=n.CLAMP_TO_EDGE,r=n.CLAMP_TO_EDGE){const h=n.createTexture();return n.bindTexture(n.TEXTURE_2D,h),Pt(n,e,i,s,r),Ct(n,t),n.bindTexture(n.TEXTURE_2D,null),h}function Pt(n,t,e,i,s){n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,t),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,e),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,i),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,s)}function j(n,t,e,i,s,r=0,h=WebGL2RenderingContext.FLOAT,a=!1){n.enableVertexAttribArray(t),n.vertexAttribPointer(t,e,h,a,i,s),n.vertexAttribDivisor(t,r)}function St(n,t,e,i,s){n.bindBuffer(t,e),n.bufferData(t,i,s),n.bindBuffer(t,null)}function yt(n){let t=0,e=0;return n instanceof HTMLVideoElement?(t=n.videoWidth,e=n.videoHeight):n instanceof HTMLImageElement?(t=n.naturalWidth,e=n.naturalHeight):n instanceof HTMLCanvasElement&&(t=n.width,e=n.height),{width:t,height:e}}class it extends K{constructor(e,i,s=i,r=1,h={},a){super();o(this,"M");o(this,"F");o(this,"l");o(this,"$");o(this,"P");o(this,"S",[]);o(this,"U",null);o(this,"k");o(this,"R");o(this,"D",null);o(this,"L",new Map);this.M=i,this.F=s,this.$=e,this.k=U(r,1,8),this.R=a,this.l={filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte",depth:!0,...h};const l=e.getParameter(e.MAX_DRAW_BUFFERS),u=e.getParameter(e.MAX_COLOR_ATTACHMENTS);this.k=Math.min(this.k,l,u),this.P=e.createFramebuffer(),this.O(),this.H(),this.l.depth&&this.I()}O(){const e=this.$,i=this.l.filter==="linear"?e.LINEAR:e.NEAREST,s=this.l.wrap==="repeat"?e.REPEAT:e.CLAMP_TO_EDGE;for(let r=0;r<this.k;r++){const h=e.createTexture();e.bindTexture(e.TEXTURE_2D,h),Pt(e,i,i,s,s),this.G(h,!1),this.S.push(h)}e.bindTexture(e.TEXTURE_2D,null)}G(e,i=!0){const s=this.$,r=this.l.type==="float"?s.FLOAT:s.UNSIGNED_BYTE,h=r===s.FLOAT?s.RGBA32F:s.RGBA8,a=s.RGBA;i&&s.bindTexture(s.TEXTURE_2D,e),s.texImage2D(s.TEXTURE_2D,0,h,this.M,this.F,0,a,r,null)}H(){const e=this.$;if(e.bindFramebuffer(e.FRAMEBUFFER,this.P),this.k===1)e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.S[0],0);else{const i=[];for(let s=0;s<this.k;s++){const r=e.COLOR_ATTACHMENT0+s;e.framebufferTexture2D(e.FRAMEBUFFER,r,e.TEXTURE_2D,this.S[s],0),i.push(r)}e.drawBuffers(i)}e.bindFramebuffer(e.FRAMEBUFFER,null)}I(){const e=this.$;this.U=e.createRenderbuffer(),this.N(),e.bindFramebuffer(e.FRAMEBUFFER,this.P),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,this.U),e.bindFramebuffer(e.FRAMEBUFFER,null)}N(){if(!this.U)return;const e=this.$;e.bindRenderbuffer(e.RENDERBUFFER,this.U),e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT24,this.M,this.F),e.bindRenderbuffer(e.RENDERBUFFER,null)}j(e){et(this.$,this.S[0],e)}resize(e,i){this.M=e,this.F=i,this.L.clear();const s=this.$;for(const r of this.S)this.G(r,!0);s.bindTexture(s.TEXTURE_2D,null),this.N(),this.D=null}readPixels(e){const i=this.L.get(e);if(i)return i;const s=this.$,r=this.M,h=this.F,a=new Uint8Array(r*h*4),l=s.getParameter(s.READ_FRAMEBUFFER_BINDING);s.bindFramebuffer(s.READ_FRAMEBUFFER,this.P),s.readBuffer(s.COLOR_ATTACHMENT0+e),s.readPixels(0,0,r,h,s.RGBA,s.UNSIGNED_BYTE,a),s.bindFramebuffer(s.READ_FRAMEBUFFER,l);const u=4*r,c=new Uint8Array(a.length);for(let f=0;f<h;f++){const g=(h-1-f)*u,p=f*u;c.set(a.subarray(g,g+u),p)}return this.L.set(e,c),c}begin(){const e=this.$;this.L.clear(),this.R.X(),this.R.Y(this.P,this.M,this.F,this.k),this.l.depth&&e.clear(e.DEPTH_BUFFER_BIT),this.R.state.K()}end(){this.R.state.W(),this.R.Z(),this.R.q()}V(){return this.D||this.J(),this.D}J(){if(!this.R)return;const e=this.k>1,i=this.k>2,s=this.k>3,r={Ub:this.S[0],Uc:e?this.S[1]:this.S[0],Ud:i?this.S[2]:this.S[0],Ue:s?this.S[3]:this.S[0],Uf:[this.M,this.F],Ug:e,Uh:i,Ui:s},h=this.R.materialManager.tt;this.D=this.R.materialManager.st(h,r)}dispose(){const e=this.$;e.deleteFramebuffer(this.P),this.S.forEach(i=>{e.deleteTexture(i)}),this.U&&e.deleteRenderbuffer(this.U),super.dispose()}get width(){return this.M}get height(){return this.F}get framebuffer(){return this.P}get textures(){return this.S}get attachmentCount(){return this.k}}function Y(n){return typeof n=="object"&&n!==null&&"textures"in n&&Array.isArray(n.textures)}function Xt(n){if(typeof n=="number"||typeof n=="boolean")return!0;if(Array.isArray(n)){if(n.length===0)return!0;const t=n[0];return typeof t=="number"||!!Array.isArray(t)}return n instanceof Float32Array||n instanceof Int32Array||!!Y(n)||typeof WebGLTexture<"u"&&n instanceof WebGLTexture}class z extends K{constructor(e,i,s){super();o(this,"$");o(this,"et");o(this,"it",new Map);o(this,"rt",new Map);o(this,"nt",new Map);o(this,"ht",0);o(this,"ot",new Map);o(this,"ct");this.$=e,this.ct=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)??16,this.et=this.lt(i,s),this.ut()}ut(){const e=this.$.getProgramParameter(this.et,this.$.ACTIVE_UNIFORMS);for(let i=0;i<e;i++){const s=this.$.getActiveUniform(this.et,i);if(s){const r=s.name.replace(/\[0\]$/,""),h=this.$.getUniformLocation(this.et,r);h&&(this.it.set(r,h),this.rt.set(r,{type:s.type,size:s.size}))}}}lt(e,i){const s=this.ft(this.$.VERTEX_SHADER,e),r=this.ft(this.$.FRAGMENT_SHADER,i),h=this.$.createProgram();if(!h)throw new Error("Failed to create WebGL program");if(this.$.attachShader(h,s),this.$.attachShader(h,r),this.$.linkProgram(h),!this.$.getProgramParameter(h,this.$.LINK_STATUS)){const a=this.$.getProgramInfoLog(h);throw new Error(`Shader program link error: ${a}`)}return this.$.deleteShader(s),this.$.deleteShader(r),h}ft(e,i){const s=this.$.createShader(e);if(!s)throw new Error(`Failed to create shader of type ${e}`);if(this.$.shaderSource(s,i),this.$.compileShader(s),!this.$.getShaderParameter(s,this.$.COMPILE_STATUS)){const r=this.$.getShaderInfoLog(s);throw this.$.deleteShader(s),new Error(`Shader compilation error: ${r}`)}return s}dt(){this.$.useProgram(this.et),this.vt()}vt(){this.ht=0,this.ot.clear();for(const[e,i]of this.nt)(i instanceof WebGLTexture||Y(i))&&this.nt.delete(e)}gt(e){for(const i in e)this._t(i,e[i])}_t(e,i){const s=this.it.get(e);if(!s)return;const r=this.nt.get(e);let h=!0;if(r!==void 0&&(typeof i=="number"||typeof i=="boolean"?r===i&&(h=!1):(i instanceof WebGLTexture||Y(i))&&r===i&&(h=!1)),!h)return;typeof i=="number"||typeof i=="boolean"||i instanceof WebGLTexture||Y(i)?this.nt.set(e,i):this.nt.delete(e);const a=this.rt.get(e);if(!a)return;const{type:l,size:u}=a,c=this.$;if(i instanceof WebGLTexture){const f=this.yt(e);return c.uniform1i(s,f),c.activeTexture(c.TEXTURE0+f),void c.bindTexture(c.TEXTURE_2D,i)}if(Y(i)){const f=this.yt(e);return c.uniform1i(s,f),c.activeTexture(c.TEXTURE0+f),void c.bindTexture(c.TEXTURE_2D,i.textures[0])}if(Xt(i),typeof i!="number")if(typeof i!="boolean")if(Array.isArray(i)&&Array.isArray(i[0])){const f=i.flat();switch(l){case c.FLOAT_VEC2:c.uniform2fv(s,f);break;case c.FLOAT_VEC3:c.uniform3fv(s,f);break;case c.FLOAT_VEC4:c.uniform4fv(s,f)}}else{const f=i;switch(l){case c.FLOAT:u>1?c.uniform1fv(s,f):c.uniform1f(s,f[0]);break;case c.FLOAT_VEC2:c.uniform2fv(s,f);break;case c.FLOAT_VEC3:c.uniform3fv(s,f);break;case c.FLOAT_VEC4:c.uniform4fv(s,f);break;case c.INT:u>1?c.uniform1iv(s,f):c.uniform1i(s,f[0]);break;case c.INT_VEC2:c.uniform2iv(s,f);break;case c.INT_VEC3:c.uniform3iv(s,f);break;case c.INT_VEC4:c.uniform4iv(s,f);break;case c.BOOL:c.uniform1iv(s,f);break;case c.FLOAT_MAT2:c.uniformMatrix2fv(s,!1,f);break;case c.FLOAT_MAT3:c.uniformMatrix3fv(s,!1,f);break;case c.FLOAT_MAT4:c.uniformMatrix4fv(s,!1,f)}}else c.uniform1i(s,i?1:0);else l===c.INT||l===c.BOOL?c.uniform1i(s,i):c.uniform1f(s,i)}yt(e){const i=this.ot.get(e);if(i!==void 0)return i;if(this.ht>=this.ct)throw new Error(`[textmode.js] Shader attempted to bind more than ${this.ct} texture samplers. Uniform "${e}" cannot be assigned.`);const s=this.ht++;return this.ot.set(e,s),s}get program(){return this.et}dispose(){this.$.deleteProgram(this.et),super.dispose()}}const Ot=new WeakMap;function wt(n,t){Ot.set(n,t)}function Nt(n){return Ot.get(n)}function st(n,t,e,i,s=255){n[0]=t/255,n[1]=(e??t)/255,n[2]=(i??t)/255,n[3]=s/255}class rt{constructor(){o(this,"wt",1);o(this,"At",0);o(this,"bt",0);o(this,"Ct",0);o(this,"xt",0);o(this,"Mt",0);o(this,"Ft",0);o(this,"$t",[0,0,0]);o(this,"Pt","");o(this,"Tt",[1,1,1,1]);o(this,"St",[0,0,0,1]);o(this,"Et",!1);o(this,"kt",!1);o(this,"Rt",!1);o(this,"Dt",0);o(this,"Lt",[0,0,0,1]);o(this,"Ot",!1);o(this,"zt",[]);o(this,"Ht",[])}static Bt(){return{It:1,At:0,bt:0,Ct:0,xt:0,Mt:0,Ft:0,Dt:0,Gt:!1,Nt:!1,Rt:!1,Ot:!1,jt:[0,0,0],Qt:"",Xt:[1,1,1,1],Yt:[0,0,0,1]}}Kt(t){t.It=this.wt,t.At=this.At,t.bt=this.bt,t.Ct=this.Ct,t.xt=this.xt,t.Mt=this.Mt,t.Ft=this.Ft,t.Gt=this.Et,t.Nt=this.kt,t.Rt=this.Rt,t.Dt=this.Dt,t.Ot=this.Ot,t.jt[0]=this.$t[0],t.jt[1]=this.$t[1],t.jt[2]=this.$t[2],t.Qt=this.Pt,t.Xt[0]=this.Tt[0],t.Xt[1]=this.Tt[1],t.Xt[2]=this.Tt[2],t.Xt[3]=this.Tt[3],t.Yt[0]=this.St[0],t.Yt[1]=this.St[1],t.Yt[2]=this.St[2],t.Yt[3]=this.St[3]}Wt(t){this.wt=t.It,this.At=t.At,this.bt=t.bt,this.Ct=t.Ct,this.xt=t.xt,this.Mt=t.Mt,this.Ft=t.Ft,this.Et=t.Gt,this.kt=t.Nt,this.Rt=t.Rt,this.Dt=t.Dt,this.Ot=t.Ot,this.$t[0]=t.jt[0],this.$t[1]=t.jt[1],this.$t[2]=t.jt[2],this.Pt=t.Qt,this.Tt[0]=t.Xt[0],this.Tt[1]=t.Xt[1],this.Tt[2]=t.Xt[2],this.Tt[3]=t.Xt[3],this.St[0]=t.Yt[0],this.St[1]=t.Yt[1],this.St[2]=t.Yt[2],this.St[3]=t.Yt[3]}K(){let t=this.Ht.pop();t||(t=rt.Bt()),this.Kt(t),this.zt.push(t)}W(){const t=this.zt.pop();t?(this.Wt(t),this.Ht.push(t)):console.warn("pop() called without matching push()")}Zt(t){this.Kt(t)}qt(t){this.wt=Math.abs(t)}Vt(){this.At=0,this.bt=0,this.Ct=0,this.xt=0,this.Mt=0,this.Ft=0,this.Ot=!1}Jt(t){t!==0&&(this.xt+=H(t))}ts(t){t!==0&&(this.Mt+=H(t))}ss(t){t!==0&&(this.Ft+=H(t))}es(t=0,e=0,i=0){t===0&&e===0&&i===0||(this.At+=t,this.bt+=e,this.Ct+=i)}rs(t){this.es(t,0,0)}ns(t){this.es(0,t,0)}hs(t){this.es(0,0,t)}cs(t){this.$t[0]=t[0],this.$t[1]=t[1],this.$t[2]=t[2]}ls(t){this.Pt=t}us(t,e,i,s=255){st(this.Tt,t,e,i,s)}fs(t,e,i,s=255){st(this.St,t,e,i,s)}ds(t){this.Et=t}ps(t){this.kt=t}vs(t){this.Rt=t}gs(t){this.Dt=Mt(t)}_s(t,e,i,s){st(this.Lt,t,e,i,s)}ws(t){this.Ot=t}get canvasBackgroundColor(){return this.Lt}get charColor(){return this.Tt}get cellColor(){return this.St}get lineWeight(){return this.wt}get character(){return this.$t}get characterString(){return this.Pt}get useOrtho(){return this.Ot}get rotationX(){return this.xt}get rotationY(){return this.Mt}get rotationZ(){return this.Ft}get translationX(){return this.At}get translationY(){return this.bt}get translationZ(){return this.Ct}get charRotation(){return this.Dt}get flipX(){return this.Et}get flipY(){return this.kt}get invert(){return this.Rt}}const bt=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,-.5,.5,0,1,-.5,.5,0,1,.5,-.5,1,0,.5,.5,1,1]),k={As:16,bs:WebGL2RenderingContext.TRIANGLES,Cs:{Ms:{size:2,offset:0},Fs:{size:2,offset:8}}};class le{constructor(t){o(this,"$");o(this,"$s");o(this,"Ps");this.$=t,this.$s=t.createBuffer(),this.Ps=new Float32Array(bt.length)}Ts(t,e,i,s){const r=this.$,h=Nt(this.$),a=h[2],l=h[3],u=t/a*2-1,c=(t+i)/a*2-1,f=1-(e+s)/l*2,g=1-e/l*2,p=bt,v=this.Ps;for(let d=0;d<p.length;d+=4){const m=p[d],w=p[d+1],A=p[d+2],y=p[d+3],b=u+(m+.5)*(c-u),T=f+(w+.5)*(g-f);v[d]=b,v[d+1]=T,v[d+2]=A,v[d+3]=y}r.bindBuffer(r.ARRAY_BUFFER,this.$s),r.bufferData(r.ARRAY_BUFFER,v,r.DYNAMIC_DRAW),j(r,0,2,16,0),j(r,1,2,16,8),r.drawArrays(r.TRIANGLES,0,6),r.disableVertexAttribArray(1),r.disableVertexAttribArray(0),r.bindBuffer(r.ARRAY_BUFFER,null)}Ss(){this.$.deleteBuffer(this.$s)}}var C=(n=>(n.RECTANGLE="rectangle",n.LINE="line",n.ELLIPSE="ellipse",n.ARC="arc",n.TRIANGLE="triangle",n.BEZIER_CURVE="bezier_curve",n))(C||{});const ce={rectangle:2,line:2,ellipse:2,triangle:2,arc:3,bezier_curve:4};class ue{constructor(t){o(this,"$");o(this,"Es",new Map);o(this,"ks",null);this.$=t}Rs(t,e,i,s){const r=this.$,h=t.program;let a=this.Es.get(t);a||(a=new Map,this.Es.set(t,a),t.C(()=>this.Ds(t)));let l=a.get(e)||null;if(l)this.ks!==l&&(r.bindVertexArray(l),this.ks=l);else{l=r.createVertexArray(),a.set(e,l),r.bindVertexArray(l),this.ks=l,r.bindBuffer(r.ARRAY_BUFFER,s);const u=r.getAttribLocation(h,"A0");u!==-1&&j(r,u,i.Cs.Ms.size,i.As,i.Cs.Ms.offset,0,r.FLOAT,!1);const c=r.getAttribLocation(h,"A1");c!==-1&&j(r,c,i.Cs.Fs.size,i.As,i.Cs.Fs.offset,0,r.FLOAT,!1)}}Ds(t){const e=this.Es.get(t);if(e){for(const[,i]of e)i&&this.$.deleteVertexArray(i);this.Es.delete(t)}}Ls(){this.ks!==null&&(this.$.bindVertexArray(null),this.ks=null)}Ss(){for(const[,t]of this.Es)for(const[,e]of t)e&&this.$.deleteVertexArray(e);this.Es.clear()}}class O{}o(O,"BYTES_PER_INSTANCE",144),o(O,"FLOATS_PER_INSTANCE",36);function N(n,t){return{location:-1,size:n,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:O.BYTES_PER_INSTANCE,offset:t,divisor:1}}class nt{}o(nt,"STRIDE",O.BYTES_PER_INSTANCE),o(nt,"ATTRIBUTES",{A2:N(2,0),A3:N(2,8),A4:N(3,16),A5:N(4,28),A6:N(4,44),A7:N(4,60),A8:N(3,76),A9:N(3,88),Aa:N(4,100),Ab:N(4,116),Ac:N(3,132)});class fe{constructor(t=1e3,e=1.5){o(this,"Os");o(this,"zs");o(this,"Hs");o(this,"Bs",0);o(this,"Is",0);this.zs=t,this.Hs=e;const i=t*O.FLOATS_PER_INSTANCE;this.Os=new Float32Array(i)}Gs(t){if(t<=this.zs)return;const e=Math.ceil(t*this.Hs),i=this.zs;this.zs=e;const s=new Float32Array(e*O.FLOATS_PER_INSTANCE),r=i*O.FLOATS_PER_INSTANCE;s.set(this.Os.subarray(0,Math.min(r,this.Bs))),this.Os=s}Ns(t){this.Bs+=t,this.Is++}js(){this.Bs=0,this.Is=0}Qs(t=0,e){return this.Os.subarray(t,e??this.Bs)}get Xs(){return this.Is}get Ys(){return this.zs}get Ks(){return this.Bs}get Ws(){return this.Is===0}}class de{constructor(t){o(this,"Os");this.Os=t}Zs(t){this.Os.Is>=this.Os.zs&&this.Os.Gs(this.Os.Is+1);const e=this.Os.Os,i=this.Os.Bs;e[i+0]=t.x,e[i+1]=t.y,e[i+2]=t.width,e[i+3]=t.height,e[i+4]=t.char0,e[i+5]=t.char1,e[i+6]=t.char2,e[i+7]=t.r1,e[i+8]=t.g1,e[i+9]=t.b1,e[i+10]=t.a1,e[i+11]=t.r2,e[i+12]=t.g2,e[i+13]=t.b2,e[i+14]=t.a2,e[i+15]=t.invert,e[i+16]=t.flipX,e[i+17]=t.flipY,e[i+18]=t.charRot,e[i+19]=t.translationX,e[i+20]=t.translationY,e[i+21]=t.translationZ,e[i+22]=t.rotationX,e[i+23]=t.rotationY,e[i+24]=t.rotationZ;const s=t.curveParams0,r=t.curveParams1;return e[i+25]=s[0],e[i+26]=s[1],e[i+27]=s[2],e[i+28]=s[3],e[i+29]=r[0],e[i+30]=r[1],e[i+31]=r[2],e[i+32]=r[3],e[i+33]=t.depth,e[i+34]=t.baseZ,e[i+35]=t.geometryType,this.Os.Ns(O.FLOATS_PER_INSTANCE),this.Os.Is-1}get Xs(){return this.Os.Xs}}class ge{constructor(t,e=1e3){o(this,"$");o(this,"qs",null);o(this,"Vs",0);o(this,"Js",new WeakMap);o(this,"te",0);o(this,"se",new WeakMap);this.$=t,this.ee(e)}ee(t){const e=this.$;this.qs&&e.deleteBuffer(this.qs),this.te++,this.qs=e.createBuffer();const i=t*O.BYTES_PER_INSTANCE;St(e,e.ARRAY_BUFFER,this.qs,i,e.DYNAMIC_DRAW),this.Vs=t}ie(t){this.ee(t)}get Ys(){return this.Vs}re(t,e){if(e===0)return;const i=this.$;i.bindBuffer(i.ARRAY_BUFFER,this.qs);const s=e*O.FLOATS_PER_INSTANCE;i.bufferSubData(i.ARRAY_BUFFER,0,t,0,s)}ne(t){let e=this.Js.get(t);if(!e){e=new Map;const i=this.$;for(const s in nt.ATTRIBUTES){const r=s,h=i.getAttribLocation(t,r);h!==-1&&e.set(r,h)}this.Js.set(t,e)}return e}he(t){const e=this.$,i=t.program;if(this.se.get(i)===this.te)return;const s=this.ne(i);for(const[r,h]of s){const a=nt.ATTRIBUTES[r];a&&j(e,h,a.size,a.stride,a.offset,a.divisor,a.type,a.normalized)}this.se.set(i,this.te)}Ss(){this.qs&&(this.$.deleteBuffer(this.qs),this.qs=null)}}class pe{constructor(t,e=1e3,i=1.5){o(this,"$");o(this,"Os");o(this,"oe");o(this,"ae");this.$=t,this.Os=new fe(e,i),this.oe=new de(this.Os),this.ae=new ge(t,e)}ce(t){var r,h,a,l,u,c,f,g,p,v;const e=this.Os;e.Is>=e.zs&&e.Gs(e.Is+1);const i=e.Os,s=e.Bs;return i[s+0]=t.Ms[0],i[s+1]=t.Ms[1],i[s+2]=t.le[0],i[s+3]=t.le[1],i[s+4]=t.jt[0],i[s+5]=t.jt[1],i[s+6]=t.jt[2],i[s+7]=t.Xt[0],i[s+8]=t.Xt[1],i[s+9]=t.Xt[2],i[s+10]=t.Xt[3],i[s+11]=t.Yt[0],i[s+12]=t.Yt[1],i[s+13]=t.Yt[2],i[s+14]=t.Yt[3],i[s+15]=t.ue[0],i[s+16]=t.ue[1],i[s+17]=t.ue[2],i[s+18]=t.Dt,i[s+19]=((r=t.fe)==null?void 0:r[0])??0,i[s+20]=((h=t.fe)==null?void 0:h[1])??0,i[s+21]=((a=t.fe)==null?void 0:a[2])??0,i[s+22]=((l=t.de)==null?void 0:l[0])??0,i[s+23]=((u=t.de)==null?void 0:u[1])??0,i[s+24]=((c=t.de)==null?void 0:c[2])??0,t.pe&&t.ve?(i[s+25]=((f=t.ge)==null?void 0:f[0])??0,i[s+26]=((g=t.ge)==null?void 0:g[1])??0,i[s+27]=((p=t.me)==null?void 0:p[0])??0,i[s+28]=((v=t.me)==null?void 0:v[1])??0,i[s+29]=t.pe[0],i[s+30]=t.pe[1],i[s+31]=t.ve[0],i[s+32]=t.ve[1]):t._e?(i[s+25]=t._e[0],i[s+26]=t._e[1],i[s+27]=0,i[s+28]=0,i[s+29]=0,i[s+30]=0,i[s+31]=0,i[s+32]=0):(i[s+25]=0,i[s+26]=0,i[s+27]=0,i[s+28]=0,i[s+29]=0,i[s+30]=0,i[s+31]=0,i[s+32]=0),i[s+33]=t.ye||0,i[s+34]=t.we||0,i[s+35]=t.Ae||0,e.Ns(O.FLOATS_PER_INSTANCE),e.Is-1}be(){this.Os.Ys>this.ae.Ys&&this.ae.ie(this.Os.Ys)}get instanceBuffer(){return this.Os}get writer(){return this.oe}get Ce(){return this.Os.Xs}get Ws(){return this.Os.Ws}xe(){this.Os.js()}he(t){const e=this.Os.Xs;if(e===0)return;this.be();const i=this.Os.Qs();this.ae.re(i,e),this.ae.he(t)}Ts(t,e){const i=this.Os.Xs;i!==0&&this.$.drawArraysInstanced(t,0,e,i)}Ss(){this.ae.Ss()}}class G{constructor(t,e,i,s){o(this,"$");o(this,"Me");o(this,"Fe");o(this,"$e");o(this,"Pe",null);o(this,"Te",[0,0,0,0]);o(this,"Se",[0,0,0,0]);o(this,"Ee");var r,h;this.$=t,this.Me=e,this.Fe=i,this.$e=s,this.Ee=(r=this.Te,h=this.Se,{x:0,y:0,width:0,height:0,char0:0,char1:0,char2:0,r1:0,g1:0,b1:0,a1:0,r2:0,g2:0,b2:0,a2:0,invert:0,flipX:0,flipY:0,charRot:0,translationX:0,translationY:0,translationZ:0,rotationX:0,rotationY:0,rotationZ:0,curveParams0:r,curveParams1:h,depth:0,baseZ:0,geometryType:0});const a=this.$.createBuffer();St(this.$,this.$.ARRAY_BUFFER,a,this.$e.ke,this.$.STATIC_DRAW),this.Pe=a}get type(){return this.Fe}get unitGeometry(){return this.$e}get unitBuffer(){return this.Pe}get batch(){return this.Me}Re(){this.Me.xe()}De(){return!this.Me.Ws}Ss(){this.Me.Ss(),this.$.deleteBuffer(this.Pe)}Le(t,e,i){return this.Me.ce(t)}Oe(t,e,i,s,r,h){const a=r.At??0,l=r.bt??0,u=r.Ct??0,c=r.xt??0,f=r.Mt??0,g=r.Ft??0,p=this.Te,v=this.Se;p[0]=0,p[1]=0,p[2]=0,p[3]=0,v[0]=0,v[1]=0,v[2]=0,v[3]=0,h&&(h.bezStartX!==void 0&&h.bezStartY!==void 0&&h.bezEndX!==void 0&&h.bezEndY!==void 0?(p[0]=h.cp1x??0,p[1]=h.cp1y??0,p[2]=h.cp2x??0,p[3]=h.cp2y??0,v[0]=h.bezStartX??0,v[1]=h.bezStartY??0,v[2]=h.bezEndX??0,v[3]=h.bezEndY??0):h.arcStart===void 0&&h.arcStop===void 0||(p[0]=h.arcStart??0,p[1]=h.arcStop??0));const d=this.Ee;return d.x=t,d.y=e,d.width=i,d.height=s,d.char0=r.jt[0],d.char1=r.jt[1],d.char2=r.jt[2],d.r1=r.Xt[0],d.g1=r.Xt[1],d.b1=r.Xt[2],d.a1=r.Xt[3],d.r2=r.Yt[0],d.g2=r.Yt[1],d.b2=r.Yt[2],d.a2=r.Yt[3],d.invert=r.Rt?1:0,d.flipX=r.Gt?1:0,d.flipY=r.Nt?1:0,d.charRot=r.Dt,d.translationX=a,d.translationY=l,d.translationZ=u,d.rotationX=c,d.rotationY=f,d.rotationZ=g,d.depth=(h==null?void 0:h.depth)??0,d.baseZ=(h==null?void 0:h.baseZ)??0,d.geometryType=ce[this.Fe]??0,this.Me.writer.Zs(d)}}const ve={ke:bt,ze:6,...k},me={ke:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),ze:6,...k},Ae={ke:function(n=32){const t=[],e=2*Math.PI/n;for(let i=0;i<n;i++){const s=i*e,r=(i+1)%n*e,h=Math.cos(s),a=Math.sin(s),l=.5*(h+1),u=.5*(a+1),c=Math.cos(r),f=Math.sin(r),g=.5*(c+1),p=.5*(f+1);t.push(0,0,.5,.5,h,a,l,u,c,f,g,p)}return new Float32Array(t)}(32),ze:96,...k};let ye={ke:function(n){const t=[];for(let e=0;e<n;e++){const i=e/n,s=(e+1)/n;t.push(i,0,i,0,i,1,i,1,s,1,s,1)}return new Float32Array(t)}(32),ze:96,...k};const we={ke:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),ze:3,...k},be={ke:function(n=16){const t=[];for(let e=0;e<n;e++){const i=e/n,s=(e+1)/n;t.push(i,-.5,i,0,s,-.5,s,0,i,.5,i,1,i,.5,i,1,s,-.5,s,0,s,.5,s,1)}return new Float32Array(t)}(16),ze:96,...k},Ee={[C.RECTANGLE]:class extends G{constructor(n,t){super(n,t,C.RECTANGLE,ve)}ce(n,t){return this.Oe(0,0,n.width,n.height,t)}},[C.LINE]:class extends G{constructor(n,t){super(n,t,C.LINE,me)}ce(n,t){const e=n.x2-n.x1,i=n.y2-n.y1,s=Math.hypot(e,i),r=Math.atan2(i,e),h=t.It||1,a=Math.cos(-r),l=Math.sin(-r),u=n.x1*a-n.y1*l,c=n.x1*l+n.y1*a,f={...t,Ft:(t.Ft||0)+r};return this.Oe(u,c,s,h,f)}},[C.ELLIPSE]:class extends G{constructor(n,t){super(n,t,C.ELLIPSE,Ae)}ce(n,t){return this.Oe(0,0,n.width,n.height,t)}},[C.ARC]:class extends G{constructor(n,t){super(n,t,C.ARC,ye)}ce(n,t){const e=H(n.start),i=H(n.stop);return this.Oe(0,0,n.width,n.height,t,{arcStart:e,arcStop:i})}},[C.TRIANGLE]:class extends G{constructor(n,t){super(n,t,C.TRIANGLE,we)}ce(n,t){const e=Math.min(n.x1,n.x2,n.x3),i=Math.max(n.x1,n.x2,n.x3),s=Math.min(n.y1,n.y2,n.y3),r=i-e,h=Math.max(n.y1,n.y2,n.y3)-s;return this.Oe(e,s,r,h,t)}},[C.BEZIER_CURVE]:class extends G{constructor(n,t){super(n,t,C.BEZIER_CURVE,be)}ce(n,t){return this.Oe(0,0,1,t.It||1,t,{cp1x:n.cp1x,cp1y:n.cp1y,cp2x:n.cp2x,cp2y:n.cp2y,bezStartX:n.x1,bezStartY:n.y1,bezEndX:n.x2,bezEndY:n.y2})}}};class xe{constructor(t){o(this,"$");o(this,"He");o(this,"Be");o(this,"Ie",null);o(this,"Ge",new Map);o(this,"Ne",null);this.$=t,this.Be=new ue(t),this.He=new Map;for(const e of Object.values(C)){const i=new pe(t),s=new Ee[e](t,i);this.He.set(e,s)}}je(t){this.Ie=null,this.Ge.clear(),this.Ne=null;let e=null,i=null,s=null,r=!1;for(const h of t)e===h.material&&i===h.type&&r===h.state.Ot||(s&&s.De()&&this.Qe(s,e,i,r),e=h.material,i=h.type,s=this.He.get(i),r=h.state.Ot,s.Re()),s.ce(h.params,h.state);s&&s.De()&&this.Qe(s,e,i,r),this.Be.Ls()}Qe(t,e,i,s){if(this.Ie!==e.shader&&(e.shader.dt(),this.Ie=e.shader),this.Ne!==e&&(e.shader.gt(e.uniforms),this.Ne=e),this.Ge.get(e.shader)!==s){const a=Nt(this.$);e.shader.gt({Ur:a[2]/a[3],Us:[a[2],a[3]],Ut:1,Uu:s?1:0}),this.Ge.set(e.shader,s)}const r=t.unitGeometry,h=t.unitBuffer;try{this.Be.Rs(e.shader,String(i),r,h),t.batch.he(e.shader),t.batch.Ts(r.bs,r.ze)}finally{t.Re()}}Ss(){for(const t of this.He.values())t.Ss();this.He.clear(),this.Be.Ss()}}function Ut(n){let t=0;for(let e=0;e<n.length;e++)t=(t<<5)-t+n.charCodeAt(e),t&=t;return t}const It=new WeakMap;let Re=1;function Lt(n){if(n==null)return 0;if(typeof n!="object"&&typeof n!="function")return Ut(String(n));let t=It.get(n);return t||(t=Re++,It.set(n,t)),t}function V(n,t){return(n<<5)-n+t}const ht=`#version 300 es
8
+ in vec2 A0;in vec2 A1;in vec2 A2;in vec2 A3;in vec3 A4;in vec4 A5;in vec4 A6;in vec4 A7;in vec3 A8;in vec3 A9;in vec4 Aa;in vec4 Ab;in vec3 Ac;uniform vec2 Us;uniform float Ut;uniform float Uu;out vec2 v_uv;out vec3 v_glyphIndex;out vec4 v_glyphColor;out vec4 v_cellColor;out vec4 v_glyphFlags;out vec3 v_worldPosition;out vec3 v_normal;out float v_geometryType;const float A=6.28318530718f;const int B=2;const int C=3;const int D=4;vec2 E(float F,vec2 G,vec2 H,vec2 I,vec2 J){float K=1.0f-F;float L=K*K;float M=L*K;float N=F*F;float O=N*F;return M*G+3.0f*L*F*H+3.0f*K*N*I+O*J;}vec2 P(float F,vec2 G,vec2 H,vec2 I,vec2 J){float K=1.0f-F;float L=K*K;float N=F*F;return-3.0f*L*G+3.0f*(L-2.0f*K*F)*H+3.0f*(2.0f*K*F-N)*I+3.0f*N*J;}vec3 Q(vec3 R,float S){float T=cos(S);float U=sin(S);return vec3(R.x,R.y*T-R.z*U,R.y*U+R.z*T);}vec3 V(vec3 R,float S){float T=cos(S);float U=sin(S);return vec3(R.x*T+R.z*U,R.y,-R.x*U+R.z*T);}vec3 W(vec3 R,float S){float T=cos(S);float U=sin(S);return vec3(R.x*T-R.y*U,R.x*U+R.y*T,R.z);}vec3 X(vec3 R,vec3 Y){vec3 Z=R;if(Y.z!=0.0f){Z=W(Z,Y.z);}if(Y.y!=0.0f){Z=V(Z,Y.y);}if(Y.x!=0.0f){Z=Q(Z,Y.x);}return Z;}void main(){v_uv=A1;v_glyphIndex=A4;v_glyphColor=A5;v_cellColor=A6;v_glyphFlags=A7;vec4 a=Aa;vec4 b=Ab;vec2 c=A3;vec2 d=A2;float e=Ac.x;float f=Ac.y;int g=int(Ac.z);vec2 h=d;vec2 i=h+c*0.5f;float j=f+e*0.5f;vec3 k=vec3(i,j);vec3 l;if(g==D){float F=clamp(A0.x,0.0f,1.0f);vec2 G=b.xy;vec2 H=a.xy;vec2 I=a.zw;vec2 J=b.zw;vec2 m=E(F,G,H,I,J);vec2 n=P(F,G,H,I,J);float o=length(n);vec2 p=o>0.0f?n/o:vec2(1.0f,0.0f);vec2 q=vec2(-p.y,p.x);vec2 r=m;vec2 s=r+q*A0.y*c.y;l=vec3(s,f);}else if(g==C){float t=mod(a.x,A);if(t<0.0f){t+=A;}float u=mod(a.y,A);if(u<0.0f){u+=A;}float v=t-u;if(v<=0.0f){v+=A;}float S=t-A0.x*v;vec2 w=vec2(cos(S),sin(S))*A0.y;vec2 s=w*c+h;l=vec3(s,f);}else if(g==B){vec2 s=A0.xy*c+h;l=vec3(s,f);}vec3 x=X(l,A9);vec3 y=x+A8;vec3 z=vec3(0.0f,0.0f,1.0f);v_worldPosition=y;v_normal=z;v_geometryType=float(g);vec2 AA=((y.xy)/Us)*2.0f;AA.y=-AA.y;float AB=y.z/Us.y;float AC=clamp(-AB*Ut,-0.99f,0.99f);if(Uu>0.5f){gl_Position=vec4(AA,AC,1.0f);}else{float AD=0.5f;float AE=1.0f/(1.0f-AB*AD);AA*=AE;gl_Position=vec4(AA,AC,1.0f);}}`;class Te{constructor(t){o(this,"Xe",0);o(this,"Ye");o(this,"Ke");o(this,"We");o(this,"Ze",new Map);this.Ye=new z(t,ht,`#version 300 es
9
+ precision highp float;in vec3 v_glyphIndex;in vec4 v_glyphColor;in vec4 v_cellColor;in vec4 v_glyphFlags;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 A;void main(){int B=int(v_glyphFlags.r>0.5?1:0);int C=int(v_glyphFlags.g>0.5?1:0);int D=int(v_glyphFlags.b>0.5?1:0);float E=float(B|(C<<1)|(D<<2))/255.;o_character=vec4(v_glyphIndex.xy,E,clamp(v_glyphFlags.a,0.,1.));o_primaryColor=vec4(v_glyphColor.rgb,v_glyphColor.a);o_secondaryColor=vec4(v_cellColor.rgb,v_cellColor.a);A=vec4(0.);}`),this.Ke=new z(t,ht,`#version 300 es
10
+ precision highp float;in vec2 v_uv;uniform sampler2D Ub;uniform sampler2D Uc;uniform sampler2D Ud;uniform sampler2D Ue;uniform vec2 Uf;uniform bool Ug;uniform bool Uh;uniform bool Ui;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 A;void main(){vec2 B=vec2(v_uv.x,1.-v_uv.y);vec2 C=B*Uf;vec2 D=(floor(C)+0.5f)/Uf;vec4 E=texture(Ub,D);vec4 F=Ug?texture(Uc,D):vec4(0.);if(Ug&&F.a==0.){discard;}vec4 G=Uh?texture(Ud,D):vec4(0.);vec4 H=Ui?texture(Ue,D):vec4(0.);o_character=E;o_primaryColor=F;o_secondaryColor=G;A=H;}`),this.We={id:this.Xe++,shader:this.Ye,uniforms:Object.freeze({}),hash:this.qe(this.Ye,{}),isBuiltIn:!0}}get Ve(){return this.We}get tt(){return this.Ke}st(t,e={}){return{id:this.Xe++,shader:t,uniforms:Object.freeze({...e}),hash:0,isBuiltIn:!1}}qe(t,e){const i=Lt(t.program),s=function(r,h){let a=0;const l=Object.keys(r).sort();for(const u of l)a=V(a,Ut(u)),a=V(a,h(r[u]));return a}(e,this.Je.bind(this));return V(i,s)}Je(t){return typeof t=="number"||typeof t=="boolean"?function(e){return typeof e=="boolean"?e?1:0:Math.floor(e)}(t):Array.isArray(t)?function(e){let i=0;const s=Array.isArray(e[0])?e.flat():e;for(const r of s)i=V(i,typeof r=="number"?r:0);return i}(t):t instanceof Float32Array||t instanceof Int32Array?function(e){let i=0;const s=Math.min(e.length,16);for(let r=0;r<s;r++)i=V(i,e[r]);return i}(t):t instanceof WebGLTexture||Y(t)?Lt(t):0}Ss(){this.Ye.dispose(),this.Ke.dispose(),this.Ze.clear()}}class Fe{constructor(){o(this,"ti",[]);o(this,"si",1);o(this,"le",0)}ei(t,e){if(this.le>=this.ti.length){const s={id:this.si++,type:t,params:{},state:rt.Bt(),material:e};this.ti.push(s)}const i=this.ti[this.le];return i.id=this.si++,i.type=t,i.material=e,this.le++,i}ii(t,e,i){const s=this.ei(C.RECTANGLE,i),r=s.params;return r.width=t.width,r.height=t.height,e.Zt(s.state),s.id}ri(t,e,i){const s=this.ei(C.LINE,i),r=s.params;return r.x1=t.x1,r.y1=t.y1,r.x2=t.x2,r.y2=t.y2,r.thickness=t.thickness,e.Zt(s.state),s.id}ni(t,e,i){const s=this.ei(C.ELLIPSE,i),r=s.params;return r.width=t.width,r.height=t.height,r.startAngle=t.startAngle,r.endAngle=t.endAngle,r.segments=t.segments,e.Zt(s.state),s.id}hi(t,e,i){const s=this.ei(C.ARC,i),r=s.params;return r.width=t.width,r.height=t.height,r.start=t.start,r.stop=t.stop,e.Zt(s.state),s.id}oi(t,e,i){const s=this.ei(C.TRIANGLE,i),r=s.params;return r.x1=t.x1,r.y1=t.y1,r.x2=t.x2,r.y2=t.y2,r.x3=t.x3,r.y3=t.y3,e.Zt(s.state),s.id}ai(t,e,i){const s=this.ei(C.BEZIER_CURVE,i),r=s.params;return r.x1=t.x1,r.y1=t.y1,r.cp1x=t.cp1x,r.cp1y=t.cp1y,r.cp2x=t.cp2x,r.cp2y=t.cp2y,r.x2=t.x2,r.y2=t.y2,r.thickness=t.thickness,r.segments=t.segments,e.Zt(s.state),s.id}xe(){this.le=0}[Symbol.iterator](){let t=0;const e=this.le,i=this.ti;return{next:()=>t<e?{value:i[t++],done:!1}:{value:void 0,done:!0}}}}class Me{constructor(t){o(this,"$");o(this,"Ie",null);o(this,"ci");o(this,"li");o(this,"ui");o(this,"fi");o(this,"di");o(this,"pi",null);o(this,"gi",{});o(this,"mi",[]);o(this,"_i",[]);o(this,"yi",[]);o(this,"wi",null);o(this,"Ai",[0,0,0,0]);o(this,"bi",1);o(this,"Ci",new Float32Array(4));this.$=t,t.enable(t.DEPTH_TEST),t.depthFunc(t.LEQUAL),t.clearDepth(1),t.depthMask(!0),t.disable(t.CULL_FACE),this.ui=new rt,this.li=new Te(t),this.fi=new Fe,this.ci=new xe(t),this.di=new le(t);const e=[0,0,t.canvas.width,t.canvas.height];wt(t,e),this.mi.push(null),this._i.push(e),this.yi.push(1),this.wi=null,this.Ai=e,this.bi=1}X(){this.mi.push(this.wi),this._i.push([...this.Ai]),this.yi.push(this.bi)}q(){const t=this.mi.pop()??null,e=this._i.pop()??[0,0,this.$.canvas.width,this.$.canvas.height],i=this.yi.pop()??1;this.Y(t,e[2],e[3],i)}Y(t,e,i,s=1){const r=this.$;this.wi!==t&&(r.bindFramebuffer(r.FRAMEBUFFER,t),this.wi=t),this.bi=s;const h=[0,0,e,i];this.Ai[0]===h[0]&&this.Ai[1]===h[1]&&this.Ai[2]===h[2]&&this.Ai[3]===h[3]||(r.viewport(...h),wt(r,h),this.Ai=h)}xi(t){this.Ie!==t&&(this.Ie=t,t.dt())}Mi(t,e){return new z(this.$,t,e)}Fi(t){this.pi=t,t&&(this.gi={})}$i(){this.pi=null,this.gi={}}_t(t,e){this.gi[t]=e}gt(t){Object.assign(this.gi,t)}Pi(t){return new z(this.$,ht,t)}Ti(t,e,i,s){t instanceof it||!s||t.Si(s),this.fi.ii({width:e??t.width,height:i??t.height},this.ui,t.V())}Ei(t,e,i,s){this.di.Ts(t,e,i,s)}ki(t,e){if(this.pi){const i=this.li.st(this.pi,this.gi);this.fi.ii({width:t,height:e},this.ui,i)}else this.fi.ii({width:t,height:e},this.ui,this.li.Ve)}Ri(t,e,i,s){this.fi.ri({x1:t,y1:e,x2:i,y2:s},this.ui,this.li.Ve)}Di(t,e){this.fi.ni({width:t,height:e},this.ui,this.li.Ve)}Li(t,e,i,s,r,h){this.fi.oi({x1:t,y1:e,x2:i,y2:s,x3:r,y3:h},this.ui,this.li.Ve)}Oi(t,e,i,s,r,h,a,l){this.fi.ai({x1:t,y1:e,cp1x:i,cp1y:s,cp2x:r,cp2y:h,x2:a,y2:l},this.ui,this.li.Ve)}zi(t,e,i,s){this.fi.hi({width:t,height:e,start:i,stop:s},this.ui,this.li.Ve)}Hi(t,e,i=1,s={}){return new it(this.$,t,e,i,s,this)}Bi(t,e=t,i=t,s=255){this.ui._s(t,e??t,i??t,s);const[r,h,a,l]=this.ui.canvasBackgroundColor;this.Ii(r,h,a,l,!1)}xe(t=0,e=0,i=0,s=0){this.Ii(t,e,i,s,!0)}Ii(t,e,i,s,r){const h=this.$,a=this.Ci;if(this.bi>1){a[0]=r?1:0,a[1]=r?1:0,a[2]=0,a[3]=0,h.clearBufferfv(h.COLOR,0,a),a[0]=0,a[1]=0,a[2]=0,a[3]=0,h.clearBufferfv(h.COLOR,1,a),this.bi>=3&&(a[0]=t,a[1]=e,a[2]=i,a[3]=s,h.clearBufferfv(h.COLOR,2,a)),this.bi>=3&&(a[0]=0,a[1]=0,a[2]=0,a[3]=0);for(let l=3;l<this.bi;l++)h.clearBufferfv(h.COLOR,l,a)}else h.clearColor(t,e,i,s),h.clear(h.COLOR_BUFFER_BIT)}Gi(){const t=[0,0,this.$.canvas.width,this.$.canvas.height];this.$.viewport(...t),wt(this.$,t),this.Ai=t,this._i.length>0&&(this._i[0]=t)}Z(){const t=this.fi;this.ci.je(t),t.xe(),this.Ie=null}Ss(){this.li.Ss(),this.ci.Ss(),this.di.Ss()}get context(){return this.$}get state(){return this.ui}get materialManager(){return this.li}}const P={readShort:(n,t)=>(P.t.uint16[0]=n[t]<<8|n[t+1],P.t.int16[0]),readUshort:(n,t)=>n[t]<<8|n[t+1],readUshorts(n,t,e){const i=[];for(let s=0;s<e;s++)i.push(P.readUshort(n,t+2*s));return i},readUint(n,t){const e=P.t.uint8;return e[3]=n[t],e[2]=n[t+1],e[1]=n[t+2],e[0]=n[t+3],P.t.uint32[0]},readASCII(n,t,e){let i="";for(let s=0;s<e;s++)i+=String.fromCharCode(n[t+s]);return i},t:(()=>{const n=new ArrayBuffer(8);return{uint8:new Uint8Array(n),int16:new Int16Array(n),uint16:new Uint16Array(n),uint32:new Uint32Array(n)}})()};function ot(n){return n+3&-4}function at(n,t,e){n[t]=e>>>8&255,n[t+1]=255&e}function L(n,t,e){n[t]=e>>>24&255,n[t+1]=e>>>16&255,n[t+2]=e>>>8&255,n[t+3]=255&e}function Ce(n,t,e){for(let i=0;i<e.length;i++)n[t+i]=255&e.charCodeAt(i)}function Et(n,t,e){const i=t+e;let s=0;const r=P.t;for(let h=t;h<i;h+=4)r.uint8[3]=n[h]||0,r.uint8[2]=n[h+1]||0,r.uint8[1]=n[h+2]||0,r.uint8[0]=n[h+3]||0,s=s+(r.uint32[0]>>>0)>>>0;return s>>>0}class Pe{constructor(t){o(this,"b");o(this,"p",0);o(this,"bitbuf",0);o(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const i=this.b[this.p++]||0;this.bitbuf|=i<<this.bitcnt,this.bitcnt+=8}const e=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,e}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function Z(n){let t=32,e=0;for(const a of n)a&&(a<t&&(t=a),a>e&&(e=a));if(e===0)return{min:0,max:0,table:new Map};const i=new Uint32Array(e+1);for(const a of n)a&&i[a]++;const s=new Uint32Array(e+1);let r=0;i[0]=0;for(let a=1;a<=e;a++)r=r+i[a-1]<<1,s[a]=r;const h=new Map;for(let a=0;a<n.length;a++){const l=n[a];if(!l)continue;const u=s[l]++;let c=h.get(l);c||(c=[],h.set(l,c)),c[Se(u,l)]=a}return{min:t,max:e,table:h}}function xt(n,t){let e=0;for(let i=1;i<=t.max;i++){e|=n.readBits(1)<<i-1;const s=t.table.get(i);if(s&&e<s.length){const r=s[e];if(r!==void 0)return r}}throw new Error("Invalid Huffman code")}function Se(n,t){let e=0;for(let i=0;i<t;i++)e=e<<1|1&n,n>>>=1;return e>>>0}function Xe(n){if(n.length<2)throw new Error("ZLIB data too short");const t=n[0],e=n[1];if((15&t)!=8)throw new Error("Unsupported ZLIB compression method");if(((t<<8)+e)%31!=0)throw new Error("Bad ZLIB header check");let i=2;32&e&&(i+=4);const s=[];return function(r,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],l=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],u=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],c=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let f=0;for(;!f;){f=r.readBits(1);const g=r.readBits(2);if(g===0){r.alignToByte();const p=r.readBits(16);if((65535&(65535^p))!==r.readBits(16))throw new Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let v=0;v<p;v++)h.push(r.readBits(8))}else{if(g!==1&&g!==2)throw new Error("Unsupported DEFLATE type");{let p,v;if(g===1){const d=new Array(288).fill(0);for(let m=0;m<=143;m++)d[m]=8;for(let m=144;m<=255;m++)d[m]=9;for(let m=256;m<=279;m++)d[m]=7;for(let m=280;m<=287;m++)d[m]=8;p=Z(d),v=Z(new Array(32).fill(5))}else{const d=r.readBits(5)+257,m=r.readBits(5)+1,w=r.readBits(4)+4,A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],y=new Array(19).fill(0);for(let M=0;M<w;M++)y[A[M]]=r.readBits(3);const b=Z(y),T=[];for(;T.length<d+m;){const M=xt(r,b);if(M<=15)T.push(M);else if(M===16){const I=r.readBits(2)+3,X=T[T.length-1]||0;for(let pt=0;pt<I;pt++)T.push(X)}else if(M===17){const I=r.readBits(3)+3;for(let X=0;X<I;X++)T.push(0)}else{if(M!==18)throw new Error("Invalid code length symbol");{const I=r.readBits(7)+11;for(let X=0;X<I;X++)T.push(0)}}}const F=T.slice(0,d),S=T.slice(d,d+m);p=Z(F),v=Z(S)}for(;;){const d=xt(r,p);if(d<256)h.push(d);else{if(d===256)break;if(d>256&&d<286){const m=d-257;let w=a[m];const A=l[m];A&&(w+=r.readBits(A));const y=xt(r,v);if(y>=30)throw new Error("Invalid distance symbol");let b=u[y];const T=c[y];T&&(b+=r.readBits(T));const F=h.length-b;if(F<0)throw new Error("Invalid distance");for(let S=0;S<w;S++)h.push(h[F+S]||0)}else if(d===286||d===287)throw new Error("Reserved length symbol")}}}}}}(new Pe(n.subarray(i)),s),new Uint8Array(s)}function Oe(n){const t=P,e=new Uint8Array(n);if(t.readASCII(e,0,4)!=="wOFF")throw new Error("Invalid WOFF signature");const i=t.readUint(e,4),s=t.readUshort(e,12),r=t.readUint(e,16),h=[];let a=44;for(let A=0;A<s;A++){const y=t.readASCII(e,a,4),b=t.readUint(e,a+4),T=t.readUint(e,a+8),F=t.readUint(e,a+12),S=t.readUint(e,a+16);h.push({tag:y,offset:b,compLength:T,origLength:F,checksum:S}),a+=20}for(const A of h){const y=new Uint8Array(e.buffer,A.offset,A.compLength);if(A.compLength===A.origLength)A.data=new Uint8Array(y);else if(A.data=Xe(y),A.data.length!==A.origLength)if(A.data.length<A.origLength){const b=new Uint8Array(A.origLength);b.set(A.data),A.data=b}else A.data=A.data.subarray(0,A.origLength)}const l=s;let u=1,c=0;for(;u<<1<=l;)u<<=1,c++;const f=16*u,g=16*l-f;let p=12+16*l;const v={};for(const A of h)v[A.tag]=p,p=ot(p+A.data.length);const d=Math.max(r||0,p),m=new Uint8Array(d);L(m,0,i),at(m,4,l),at(m,6,f),at(m,8,c),at(m,10,g);let w=12;for(const A of h){Ce(m,w,A.tag),w+=4;const y=A.data;if(A.tag==="head"&&y.length>=12){const b=new Uint8Array(y);L(b,8,0),L(m,w,Et(b,0,ot(b.length))),w+=4}else L(m,w,Et(y,0,ot(y.length))),w+=4;L(m,w,v[A.tag]),w+=4,L(m,w,A.data.length),w+=4}for(const A of h){const y=v[A.tag];m.set(A.data,y)}if(h.find(A=>A.tag==="head")){const A=v.head,y=function(b,T){const F=T+8,S=[b[F],b[F+1],b[F+2],b[F+3]];L(b,F,0);const M=2981146554-(Et(b,0,ot(b.length))>>>0)>>>0;return b[F]=S[0],b[F+1]=S[1],b[F+2]=S[2],b[F+3]=S[3],M>>>0}(m,A);L(m,A+8,y)}return m.buffer}const Ne={parseTab(n,t,e){const i={tables:[],ids:{},off:t};n=new Uint8Array(n.buffer,t,e),t=0;const s=P,r=s.readUshort;r(n,t);const h=r(n,t+=2);t+=2;const a=[];for(let l=0;l<h;l++){const u=r(n,t),c=r(n,t+=2);t+=2;const f=s.readUint(n,t);t+=4;const g=`p${u}e${c}`;let p=a.indexOf(f);if(p===-1){let v;p=i.tables.length,a.push(f);const d=r(n,f);v=d===4?this.parse4(n,f):d===12?this.parse12(n,f):{format:d},i.tables.push(v)}i.ids[g]=p}return i},parse4(n,t){const e=P,i=e.readUshort,s=e.readUshorts,r=t,h=i(n,t+=2);i(n,t+=2);const a=i(n,t+=2)>>>1,l={format:4,searchRange:i(n,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,l.entrySelector=i(n,t),t+=2,l.rangeShift=i(n,t),t+=2,l.endCount=s(n,t,a),t+=2*a,t+=2,l.startCount=s(n,t,a),t+=2*a;for(let u=0;u<a;u++)l.idDelta.push(e.readShort(n,t)),t+=2;return l.idRangeOffset=s(n,t,a),t+=2*a,l.glyphIdArray=s(n,t,r+h-t>>1),l},parse12(n,t){const e=P.readUint;e(n,t+=4),e(n,t+=4);const i=e(n,t+=4);t+=4;const s=new Uint32Array(3*i);for(let r=0;r<3*i;r+=3)s[r]=e(n,t+(r<<2)),s[r+1]=e(n,t+(r<<2)+4),s[r+2]=e(n,t+(r<<2)+8);return{format:12,groups:s}}},Ue={parseTab(n,t,e){const i=P;t+=18;const s=i.readUshort(n,t);t+=2,t+=16;const r=i.readShort(n,t);t+=2;const h=i.readShort(n,t);t+=2;const a=i.readShort(n,t);t+=2;const l=i.readShort(n,t);return t+=2,t+=6,{unitsPerEm:s,xMin:r,yMin:h,xMax:a,yMax:l,indexToLocFormat:i.readShort(n,t)}}},Ie={parseTab(n,t,e){const i=P;t+=4;const s=i.readShort,r=i.readUshort;return{ascender:s(n,t),descender:s(n,t+2),lineGap:s(n,t+4),advanceWidthMax:r(n,t+6),minLeftSideBearing:s(n,t+8),minRightSideBearing:s(n,t+10),xMaxExtent:s(n,t+12),caretSlopeRise:s(n,t+14),caretSlopeRun:s(n,t+16),caretOffset:s(n,t+18),res0:s(n,t+20),res1:s(n,t+22),res2:s(n,t+24),res3:s(n,t+26),metricDataFormat:s(n,t+28),numberOfHMetrics:r(n,t+30)}}},Le={parseTab(n,t,e,i){const s=P,r=[],h=[],a=i.maxp.numGlyphs,l=i.hhea.numberOfHMetrics;let u=0,c=0,f=0;for(;f<l;)u=s.readUshort(n,t+(f<<2)),c=s.readShort(n,t+(f<<2)+2),r.push(u),h.push(c),f++;for(;f<a;)r.push(u),h.push(c),f++;return{aWidth:r,lsBearing:h}}},_t={cmap:Ne,head:Ue,hhea:Ie,maxp:{parseTab(n,t,e){const i=P;return i.readUint(n,t),t+=4,{numGlyphs:i.readUshort(n,t)}}},hmtx:Le,loca:{parseTab(n,t,e,i){const s=P,r=[],h=i.head.indexToLocFormat,a=i.maxp.numGlyphs+1;if(h===0)for(let l=0;l<a;l++)r.push(s.readUshort(n,t+(l<<1))<<1);else if(h===1)for(let l=0;l<a;l++)r.push(s.readUint(n,t+(l<<2)));return r}},glyf:{parseTab(n,t,e,i){const s=[],r=i.maxp.numGlyphs;for(let h=0;h<r;h++)s.push(null);return s},Ni(n,t){const e=P,i=n.ji,s=n.loca;if(s[t]===s[t+1])return null;const r=lt.findTable(i,"glyf",n.Qi);if(!r)return null;let h=r[0]+s[t];const a={};if(a.noc=e.readShort(i,h),h+=2,a.xMin=e.readShort(i,h),h+=2,a.yMin=e.readShort(i,h),h+=2,a.xMax=e.readShort(i,h),h+=2,a.yMax=e.readShort(i,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let g=0;g<a.noc;g++)a.endPts.push(e.readUshort(i,h)),h+=2;const l=e.readUshort(i,h);if(h+=2,i.length-h<l)return null;h+=l;const u=a.endPts[a.noc-1]+1;a.flags=[];for(let g=0;g<u;g++){const p=i[h];if(h++,a.flags.push(p),8&p){const v=i[h];h++;for(let d=0;d<v;d++)a.flags.push(p),g++}}a.xs=[];for(let g=0;g<u;g++){const p=a.flags[g],v=!!(16&p);2&p?(a.xs.push(v?i[h]:-i[h]),h++):v?a.xs.push(0):(a.xs.push(e.readShort(i,h)),h+=2)}a.ys=[];for(let g=0;g<u;g++){const p=a.flags[g],v=!!(32&p);4&p?(a.ys.push(v?i[h]:-i[h]),h++):v?a.ys.push(0):(a.ys.push(e.readShort(i,h)),h+=2)}let c=0,f=0;for(let g=0;g<u;g++)c+=a.xs[g],f+=a.ys[g],a.xs[g]=c,a.ys[g]=f}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},lt={parse(n){const t=new Uint8Array(n);P.readASCII(t,0,4)==="wOFF"&&(n=Oe(n));const e=new Uint8Array(n),i=_t,s={},r={ji:e,Xi:0,Qi:0};for(const h in i){const a=h,l=lt.findTable(e,a,0);if(l){const[u,c]=l;let f=s[u];f==null&&(f=i[a].parseTab(e,u,c,r),s[u]=f),Object.assign(r,{[a]:f})}}return[r]},findTable(n,t,e){const i=P,s=i.readUshort(n,e+4);let r=e+12;for(let h=0;h<s;h++){const a=i.readASCII(n,r,4);i.readUint(n,r+4);const l=i.readUint(n,r+8),u=i.readUint(n,r+12);if(a===t)return[l,u];r+=16}return null},T:_t,B:P};function Dt(n,t,e){if(n.idRangeOffset[e]===0)return t+n.idDelta[e]&65535;{const i=n.startCount.length,s=n.idRangeOffset[e]/2+(t-n.startCount[e])-(i-e);if(s>=0&&n.glyphIdArray&&s<n.glyphIdArray.length){const r=n.glyphIdArray[s];if(r!==0)return r+n.idDelta[e]&65535}}return 0}class _e{Yi(t){var i;const e=[];return(i=t.cmap)!=null&&i.tables?(t.cmap.tables.forEach(s=>{if(s.format===4){const r=this.Ki(s);e.push(...r)}else if(s.format===12){const r=this.Wi(s);e.push(...r)}}),[...new Set(e)]):[]}Ki(t){const e=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return e;for(let i=0;i<t.startCount.length;i++){const s=t.startCount[i],r=t.endCount[i];if(s!==65535||r!==65535)for(let h=s;h<=r;h++)Dt(t,h,i)>0&&this.Zi(e,h)}return e}Wi(t){const e=[];if(!t.groups)return e;for(let i=0;i<t.groups.length;i+=3){const s=t.groups[i],r=t.groups[i+1],h=t.groups[i+2];for(let a=s;a<=r;a++)h+(a-s)>0&&this.Zi(e,a)}return e}Zi(t,e){try{const i=String.fromCodePoint(e);t.push(i)}catch{}}}class De{constructor(t){o(this,"qi");o(this,"Vi");o(this,"R");o(this,"P",null);o(this,"Ji",0);o(this,"tr",0);this.R=t,this.qi=document.createElement("canvas"),this.Vi=this.qi.getContext("2d",{willReadFrequently:!0,alpha:!0})}sr(t,e,i,s){const r=t.length;this.Ji=Math.ceil(Math.sqrt(r)),this.tr=Math.ceil(r/this.Ji);const h=e.width*this.Ji,a=e.height*this.tr;this.er(h,a),this.ir(t,e,this.Ji,i,s),this.P?this.P.width===h&&this.P.height===a||this.P.resize(h,a):this.P=this.R.Hi(h,a,1,{filter:"nearest"}),this.P.j(this.qi)}er(t,e){this.qi.width=t,this.qi.height=e,this.qi.style.width=t+"px",this.qi.style.height=e+"px",this.Vi.imageSmoothingEnabled=!1,this.qi.style.imageRendering="pixelated",this.Vi.clearRect(0,0,t,e),this.Vi.textBaseline="top",this.Vi.textAlign="left",this.Vi.fillStyle="white"}ir(t,e,i,s,r){const h=s/r.head.unitsPerEm;for(let a=0;a<t.length;a++){const l=a%i,u=Math.floor(a/i),c=t[a].glyphData;if(!c)continue;const f=c.advanceWidth*h,g=l*e.width,p=u*e.height,v=g+.5*e.width,d=p+.5*e.height,m=Math.round(v-.5*e.width),w=Math.round(d-.5*s),A=m+.5*(e.width-f),y=w+r.hhea.ascender*h;this.rr(c,A,y,h)}}rr(t,e,i,s){if(!t||!t.xs||t.noc===0)return;const{xs:r,ys:h,endPts:a,flags:l}=t;if(!(r&&h&&a&&l))return;this.Vi.beginPath();let u=0;for(let c=0;c<a.length;c++){const f=a[c];if(!(f<u)){if(f>=u){const g=e+r[u]*s,p=i-h[u]*s;this.Vi.moveTo(g,p);let v=u+1;for(;v<=f;)if(1&l[v]){const d=e+r[v]*s,m=i-h[v]*s;this.Vi.lineTo(d,m),v++}else{const d=e+r[v]*s,m=i-h[v]*s;if(v+1>f){const A=e+r[u]*s,y=i-h[u]*s;if(1&l[u])this.Vi.quadraticCurveTo(d,m,A,y);else{const b=(d+A)/2,T=(m+y)/2;this.Vi.quadraticCurveTo(d,m,b,T)}break}const w=v+1;if(1&l[w]){const A=e+r[w]*s,y=i-h[w]*s;this.Vi.quadraticCurveTo(d,m,A,y),v=w+1}else{const A=(d+(e+r[w]*s))/2,y=(m+(i-h[w]*s))/2;this.Vi.quadraticCurveTo(d,m,A,y),v=w}}this.Vi.closePath()}u=f+1}}this.Vi.fill()}Ss(){var t;(t=this.P)==null||t.dispose(),this.P=null}get framebuffer(){return this.P}get columns(){return this.Ji}get rows(){return this.tr}}class Bt{nr(t,e){const i=t.cmap;if(!i||!i.tables)return 0;let s=0;for(const r of i.tables)if(r.format===4?s=this.hr(e,r):r.format===12&&(s=this.ar(e,r)),s>0)break;return s}cr(t,e){const i=e.codePointAt(0);return i===void 0?0:this.nr(t,i)}lr(t,e){const i=t.hmtx;return i&&i.aWidth&&i.aWidth.length!==0?e<i.aWidth.length?i.aWidth[e]:i.aWidth[i.aWidth.length-1]:0}ur(t,e){const i=e/t.head.unitsPerEm,s=t.hhea.ascender*i,r=t.hhea.descender*i,h=t.hhea.lineGap*i;return{ascender:s,descender:r,lineGap:h,lineHeight:s-r+h,unitsPerEm:t.head.unitsPerEm,scale:i}}hr(t,e){const i=e.endCount.length;let s=-1;for(let r=0;r<i;r++)if(t<=e.endCount[r]){s=r;break}return s===-1||t<e.startCount[s]?0:Dt(e,t,s)}ar(t,e){const i=e.groups.length/3;for(let s=0;s<i;s++){const r=e.groups[3*s],h=e.groups[3*s+1],a=e.groups[3*s+2];if(t>=r&&t<=h)return a+(t-r)}return 0}}class Be{constructor(){o(this,"dr");this.dr=new Bt}pr(t,e,i){let s=0;const r=this.dr.ur(i,e),h=r.lineHeight;for(const a of t){const l=this.dr.cr(i,a);if(l===0)continue;const u=this.dr.lr(i,l)*r.scale;s=Math.max(s,u)}return{width:Math.ceil(s),height:Math.ceil(h)}}}class He{constructor(){o(this,"vr");this.vr=new Bt}gr(t,e){const i=[],s=new Map;return t.forEach((r,h)=>{const a=r.codePointAt(0)||0,l={character:r,unicode:a,color:this.mr(h),glyphData:this._r(e,r)};i.push(l),s.set(r,l)}),{array:i,map:s}}mr(t){return[t%256/255,Math.floor(t/256)%256/255,0]}_r(t,e){const i=e.codePointAt(0)||0,s=this.vr.nr(t,i);if(s===0)return null;const r=this.vr.lr(t,s),h=lt.T.glyf.Ni(t,s);return h?{...h,advanceWidth:r}:null}}class W extends K{constructor(e,i=16){super();o(this,"yr");o(this,"wr",[]);o(this,"Ar",new Map);o(this,"br",16);o(this,"Cr",{width:0,height:0});o(this,"Mr");o(this,"Fr");o(this,"$r");o(this,"Pr");o(this,"Tr");o(this,"Sr",!1);this.br=i,this.Fr=new _e,this.$r=new De(e),this.Pr=new Be,this.Tr=new He}async Er(e){if(this.Sr)return;const i=e||"data:font/woff;base64,d09GRgABAAAAABbwAAoAAAAAfywAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABjbWFwAAAA9AAAAbsAAAkgIO8lSWdseWYAAAKwAAAOfgAAaLS4ctN0aGVhZAAAETAAAAAsAAAAOCi8/PVoaGVhAAARXAAAABkAAAAkCwEFAmhtdHgAABF4AAAAhQAABAQEAIOAbG9jYQAAEgAAAAKUAAAECAAy54BtYXhwAAAUlAAAABgAAAAgASIAgm5hbWUAABSsAAAB5wAAA6RWz85KT1MvMgAAFpQAAABFAAAAYM+QEyRwb3N0AAAW3AAAABQAAAAgAGkANHja7dRPSFRRFMfx38wdXblw4cJC7M0bz60gWlULGUFctWgR0UIQQkmDyn27kpAQaaEO2jhWJuafiQFtcDJtSqGhiFZtot5x3jzEVQQhlRJcOb0khiRc1+J94R64uw8cOADCAJT/avwZAiIpRCK3/P999KAS9biOSUxhBhlksYjnWMFrvME7vMca1vEF37ANAwkNqYRKqkk1rdLqscqpVVVQryzbils3rJnocHTWPmgfso/ap+0OuysWjlXHogQKUxVVUw3VUh010DE6QXHqph7qpT66TQmaoAxlaZnyVKC39FHHdbNu0e36or6kr4r4TgsTu75HmEcOy76vUPaVsIFNbOHHX74F3/fyD9+A7ztg1//2de76rH18Z8u+AXqwx/dBN5Z9XfqKiKzLqqzIC8nLkixKThZkXuZkVh7KuNyTuzImKRmVO1KxU7ETMtvmu/lqPptPxjOuKXo3vcveYQ+l2lKlO+Im3H632z3vnis+KaaLKc7zM87yHGc4zdM8zkke5H6+xp3cwRe4jVv5DLdwE5/ik3ycj3Cdk3eWnKfOmDPqJJ3hX9sOCvpPC65QcIWCgv5pPwGY9ak7AHja3V07ryQ5FT62axjQaDWsVmiCFQJpA4QINiAgICDYgICAgICAgICAgICAgIAA//AuF9Xlsn2etqv67iIY6apv3+6yj31e33nYA95FiD4uAAHeA7jyLzoA2Paf/Lp/Dun5W8x/Be/AxyCfO79fnj+e25/ZZzlewcM+3wIhwpfwE/Sc9e8YDyLU1ycF5XUD+to+L98O/An8VKQj0lnOtYdM776OJ71fTVC8//N1rLKDGsXl863OjSl5/iyIUu0HjJ+d+uO3rX3rXd33d/DjfR0/h6/n1iK5kWf36Hf2AxpVa6zU7ZLTnt3Q3wN7+tK6MVcBjUP/3vj56diHuT3YxVbKSvl9FdJHeFE4jfmJn2DSSOS9fuJ27SH7umuoL3oLWGOLxh3f2b8bnn/5Ql8n5SEYFD33q/0lKXxwjQfDOZtGgyEz+W8X5txl2zVb9MXO2S8HfD3ncbHousP6WPV2i/R7C+c06HK5ye/lfdl3Bj5Q2qitaLYhgLQWZY+fr/65A9Ly1r10jI783HOffJWZJ6ee8uuB0nmMXeSqWvRz5Dx/tiWf7H0OF+1DuK7vhy4ffP8An/doofqbQNXTqmlNT1c0v4/Eqpy29eBMLHty0PKZoCMW6VqRlDXNwvbD4RW2MYfyjNdXV3LaJuEdKgXcHvX2nHiz27RxHmC9w/qn0AbS+mJbSeX8pO1zlbbogPK7zJxAs3iFtrV8W/LHsHVZvxJ6Rlt7gum1nvjpnHNO4gFJqaoBWOKFVwKqAangorb2j5KKvG5N31O1ownZdhcZH7FuT9nznoxRv4ylrbfvzA9D88GO8uGDtgN0/1O09ntFlv3YhbIf/ml3/dPGqvi6rCMw6jNd53PM07BnK2eCJXmnzxrruI8ObOuxmZ/dxbd5nS77U7I/xaMdLm5/DXzuLLcwXlOLIVQ0an722pou6raGnpp/QYiwR0V5nwDL0Gk/f2TSUalIGOkSvfNAcVNCesV9a2q675FtsVAk4c5GPEfZT27XVqT9PmpxXtVn0577KO3MGrkXs+xKkHZk6EMUS440uO01t+Ark8yGYYjtsleqoPQksLuF0kOd/7TtbZ3XvNalNRNLqK+90fEDTAfy1FWWOBcT9fkTmrExe+viDNccYF+JqHeIbyBtlYxhStbmSc8DSX9/rICoXkkGSMfEJR7QsYAjNlhgn6iNS7T0AtakNnvaJ+W1TeQdeIxHaHtXaMtU+GP3CL5v+2RqHfc5JC6k9DJ6HhFaHHfu9Lc1Z5HlB5JWNOc8NupiUSlpa/7NIx0W0Ra10YcOVWnDfqhodmgI1CM5nrJS1DYKlMmyeAmoZaLrQnmNSRxAV7qZ0u0sr2Q8WbzUrRivE200nZ+x371Yj+idQH+bsOAFD16woZXuheBJI85UYyA+Ht17bJsTKLHHG+tuQpJX/AGX4eu2lq+vh8gQPgaLUpk1h7fcb1SJ4LEnGb+rdUHRHw96riVV36L5EgdqHNByqCTy82hnkrSSk3k5KTNWnJZ/buTlOvQngiceAkd4OHPz0K+tdOmGUYwJht2kcuBEntSRPOmZfyc40tFqD40IQeb2goGZvKIVzW4G5DMcQ4qOY3zVRzpmo1sMg+U1VemumtLofjFeCcxqJIUnM2vJuQeCHiOOwx4ss7pF6u+PtXxmZApbjCti22JtA+hVxUw7z6Xs2sSzMkeklSLPfwalYkjjt/0bHye4gKkXeaig5MpILVRiAd1vCrtP5Aj5uaN2PF1zxrE7koOgaY2PPL9FkccCKlprUZGr+zr0tw56iCvwGBTs+MFFxVbWeTaCQTj2WCBM1NnoWNxOBpBZU8f00hPsFDr+15wPevNsJG4IN+OGwKyWzKnW8S/GDUHZOd+44SsvbDvCuhYUTQSaQSFeWtoR4Xc833VimVzRvgm58QwZFQTthQ+awgQTeuVI7gLrF638Yixi+ot4RVZ5niDPFxBediyXNj++jUWDgkU3Zc96fDKwv4iiylyA4nalMkLX9C1hf24DNNkZyNDkflOPF4BqwdYbv1vLG9VX03W96PVKiCq+A01i5utY2d9YfSMP0qvQ7eFQUHSKvNfpCl21nqNafqf1UQksqfVe1PEPPNiJpY81iZoP119ZTUHojdpseMYqec5zr/2Jgo695rmycZWzSgOpXzMpbFrHu1Zmq/xA8pX3cgEQZU1/YzaexuQbXIoxF9THdaEzz9VaE5fgNVIPR/sIS8fQyipam9JXqHdOtPEIRllqzP7Ewh9063Z2IYH+GiLNUPFXJIcEM4RYc7bEkjwQL4/1fx+aHL8/62Of5vo3y+p92QX2fh18zrNFcPX9sfZAdBDZu8vxCM4clX31Qr9RrLPkDDDau8v8LZRar2N8lSOj1NGsLJeBZam1TIuwpzwepL3CJAvyANsPnj3BAzsD3a5X6ydEaZUSs50b7g2JrYcyG2lRL+xl+jD+Gfod33w82P0FTuYREa3c70CRS82XCtxIueJHXuIMB6tMt+x7lf7m5U4tyK9L3smuLrxqDxYPI30rYzk2h2NzgPXqAvPrQdqUxvdWF2zVwDrHCq0RoI0Hcrzcn9D8BMxYEMszZBzooqa/jsTxSeTthXTm9FC2n+pYEh8uVqyL9436quMD6pnK7njZM6msy4uYsunVquBSi4clVn8gblYc96TFyF04ll2oqCB300cDIbPxrZoqXZ1DHWvNh2irrNxstSaZYa2VB333tOr9mRcx7ETmXKmSFz6GkidstKjZFE8qIX26eG8KoS/b9uij9GFOiwFIVj5NyErT8rZGstdmD4lc4/xaNevd1uwOPCLX7Ems2TTc81MrUVmzyqdOr1v1PCPat9jmQfUYJEEbzNCSse4DevSYCIXal+bDCC3I2+EeTFKd7ltnFNN0sGLIfRcGfSWKD0BPANWTQIqcNtsaAON/1A/BeywPGhybs2ZEA1sH9FbgDMpTQx5L5k4fN/RR8lBHvif2ftB7oa8isVdrdWDxp/Hp6N8MsdUgqdS0M12EZrhC7TpJZZLZOZelRdeDUyffq3s6xPhztK4Xd9h6f4pIieNu4lI/jEN1XEMjbafK6lry/jkOYedyVMyp2vaHGlM8zBjCkdi28NdrNldgLa/a0orYtN6OwoMh7vPAsxb9eNTDrOdJBWuXsb6En8Evb5yTrJw1Y1XTHnmCFNtPkhHnuN+8QwHGi3JUJf4zeaTJsBpFdnik5V4fZq510ifEHMf7M55f2fteR1DJ73gzf4vyO42Or3Z5mZcWdlY6wb3sRvd0olKfGeaCWm5yGEtDwzLH6yPS95wmcVb2BBrYzig5tGb7Bvb5fkyfvW2nRhlxF3cyz8qGOF//eVLXq7P4oQTop9UASTKPr91h1zu5wu753DbqtXUO8pOT6wzdnQfWn2X3Csr5ktxP4FUmlBHHPThBO0mQ6wTFVxbM5mPCeXWP7ha4YDf8BdvAeaGd/XntlgHlW2eMFAR2CBPYAQzPrGeVy1ieYCOQdtpXGZyss4F2rkr5W8tJh06NTd/HGi+1vbiPN6JTeSfP5k0ihAhRQwgad9wQ1dhoKAntU87DfZy/K8SuEsPg82VQRU5xUGU+ZVrp8SMYtOHiwFC+Z1jLG2dqRuhAw01cZ2qeXBk/ROjaAS1TIuKHVp+Fi5YMrHqqahlY3YbJ0E/N2uUTq/0Cvt717Vfwa/gNfAO/hd/B7+EP8Ef4E/wZ/gJ/hb/B3+Ef8E/4F/z7nla+5T+Afp1wHdQRH/F/+/lF6VrSbuP4v/18VHMVmm7q6TX/Czha0mxJrf+YyNyOfRcYeKSap3+b8UufB8GnJSdec6Iu+toF6nHkaeZxvJ5h4PVgj3ILMz5teArdxnr8/PPoCXqiuvR91zoh2pvS8b0SqUD1FLPubHPaK9Q5lU+GzwI3PgfCOsB9NORgqm5OqfVxLMd1L9+A/s2s+0/0a93MTd3NNRHapruGQLnhZTSzpBMuYFNaz7N5RffPo/MnV2zac3wfRX6Vng0As1cTmE5M38U0eS+H0rvZxXtg6460jlQTZ3Snxw+pO9TKz+mOB5vffTs6umGj+UjMb3/QKfndvlP47UsVAO9Drzo11h+T/rF09Po0st98jHsKh31Ruj2UnbYWLuEd/pM9wOwpZ+KqccfWNZsc4F6c3jtf2ou7Ca6akqXRPThzsadua+/4hq7vgmn6uqux6bXw6AjnLMJbXMM5Ixwi8mR2rc3AOfg2nrs4zZlnDFaChbCtk/bwilwMfBxc0iMYy0MX40x2o/ft9D2Znn9Kl+3MO90HUb747jnzjpyCKVeTuij6DllsctyiUzXN0dgE9We1yK54WBffFqtew9TXpbYfy7dILWH/SXxmqeg4zlvRsZfIbuFnic0SHfRtfj4vsaVq532jl/QpYBykzpe/jec7n1uOmhuETi2xzM5vfy01xQC0vkp6PiKpDd07x6qcUc719K0A1YZjpvLivftqNpzxV/tDtXPTWFrbaowzXj+czsG+nmMt/bQspzj7fnvxeeuG4O/s/Xe412VW3+5VuPT+EV97/r++14Gc3ZvQRHrXMz91IrWHZ4FnK7WOVGjJPfAO3R0BczdLKuevQd5LPVsXd/X8PK6Ll2jK0/NM7P4V1PuI51FvsEMV+KhV4T2+22IQF85a0FlLWXs/IHTOX1B5CGCeEDh6V2ZiTK+eee/dnNjOa2xXz2zndd7sq+XYEZ/Gx/exoK5PoOceWNdnef9W9KCT9EYXqkrPxuhC9GA7faMXpHef1smLTDe1qaDY1N4ozLI4fqsHlwpf+3Cu9F1E/Z4AajG3V8430/6bCdq8QQs9b4OqJyQa1+6BACWaTPI8zrROa//7QGJ19U4tHeTTtePNqu3PnVhXJFSjzZFz4eo3Ndqidi/O6J5Z7X+VsS3cYki51T35Iv+merFeuGe69cbJM3Jq1Fn4kUA5rze4o9CRs22iy5jMsYLMS8g5/wOjbDW/AAB42mNgZGBgAOIzT9tXxvPbfGVgYGEAgZokCXVkmgUizsHABFLNwAAACJYG1HjaY2BkYGBhAAEIyc7AwMiAAhgZAQHPABQAAAB42r1TwRaAIAgD88P59PRA0hxUlw578mBDQOwi0i+oDUzb7nC/xyKH8SuwHH/jSx83jnE745c1RO44G9E1WTE14AQtYvKO6PN6BXRW5EONgCazSS4VXiere+sp7F7cQeSp7Pe2YkaxN7fVFhg/8z/1hfnfaBXnZ8k7wNzp/y13+wRWwErCAAAAeNpl0ylUVVEUBuCtoiKgoiIzAjIIMj9mZBZYMsmMjwcuBhEIBoPBYDAYDAaDwWA0GAwGgsFgMBgMBoPBYDAYDAaDweBnlrX+9e6955x/2oeI//664HbEgTL4HnHwZ8Sh1/AlIm0W3kUc3oN9+BFxJBva4E3E0SvwLCIdR/qniGO98Coiw3vG04hMv5n/fj9GZBUD3iz8xx9FnMiBJxEn0+E+/IrIppNt/VQzvITfEadH4HnEmUG4BV8jchaBn7NZgCMXdy7uXGfzeMjjKZ/PfBwF9hTYU/AhotC5QtpFtIt4K7oLnyOK6RXTKP4TUcJDCe5zNXAHcJTiKOWxlEZZPeAo00U5b+XyltM9vw24KvBWyFzpTOWLiCr5qu6BPdV0qx+Cni+sAc4a3mvw1nqu/RZxsRJkrEsDWeo2wAzq8dY/iGgwpwbfGvTdaA6NOmnUb5PnpiTY00S3SXfN/DU/BustdFrMq8VagqcE/YReEjK3+t4qayuPbTTbdNH2PqJdL+06a5e33VoHjg7vHdY7cXTK2ekedPHWha+b5279ddPo1ndPPuDrkbkH3yX5e/XXy3OvzH34+sy132+//P14B/AO6GuA3qBOB3U6hH/It2Haw2Y2rI9hHV6WdcSsR6eAl1GZx3Qwpr9xcxv3PqGDCbyTvE3KM+muT+lwypkpe6bNaZqfaX6v8j7D8wyNGbwzbyNmdTMrzxxfc9bndDFn5vM8zds37x4smMeCHhf5WTKHJb0uuc/L/C7bs4zrGr2kO5m0ntRZkv8VfazIkvI9RSelg5ReUrKvOrvqHq7p4Lr5retx3fcN/5Mb+Dfs25RpE/8mji0etqzfwLHteZufmzrZobfj/K5ednna0/fe/l+Pca7seNpjYGRgYGRkaGBQYAABJgY0AAAP+ACmeNp1ksFO20AQhv8NgRJaUApSy61LDxVc4uAjNxoJReoNKdCrYy8hZb1rrTcIuPMKfaY+QM899RH6AP3tDJEKqlcefzvzz/xrywD21ScoLK9N3ktW5E3hDl6hL7zG7HvhLrMfhNfxGonwBjUnwj2uz8JbzH4R3sZbPArvIMV34T28wQ+6qG6Puz5+Civyb+EOO/4Ir6GvOsJdaLUrvI53KhXeoGYs3MOu+iq8hai+CW/jo/olvIOiA+E97HeKw/xIp8M0nYQ6O/MunpvZwmbhafv01JK/MKGee6ePB8N/JCFzN6dO+8o4bee5cbnRM+NMyKyuFqHytdHR3MXSF0ZfNQOn93rVORoNm4l64ua3NMjsdYxVfZIkeTBZZC73ZeldPfBhllSLKR0KX2ZzlzyY4BO2JmNjrdeXPtjiAIfIcQTNbz/knWKCgBoZzuDhEHEOgxkWsMyFF9Xne/1Mf8Fdo5i3dY1jDOjz/ymB0eEGp63ao2J/Q5YT8pabqOnQsGn1lvuKjoHRc05Tj4x3jCUzRZu5Wp1winvGl54jruHqjI3C0fVW3qDxuWZ/pEvNPzjhylkxrETR5fQoW09HzYDPwJMm7emm8g5Fq8nIjpWHdronLV0TjJmxXJ4nuGwnWPYcAH8BoeumrAB42mNgYmFgnMDAysDCxMDEAAIQGoiNGc6A+CwMENDAwNDNwFDwGMpliHT00WNwYFBQy4aogJCMgSCSGcJTYGAAAEBYBpIAAAB42mNgZoCANAZjIMnIgAYADecAng==",s=await this.kr(i);await this.Rr(s)}Dr(e){if(e===void 0)return this.br;this.br=e,this.Lr()}Lr(){const e=this.wr.map(i=>i.character);this.Cr=this.Pr.pr(e,this.br,this.yr),this.$r.sr(this.wr,this.Cr,this.br,this.yr)}async Or(e){try{const i=await this.kr(e);await this.Rr(i)}catch(i){throw new R(`Failed to load font: ${i instanceof Error?i.message:"Unknown error"}`,{originalError:i})}}async kr(e){const i=await fetch(e);if(!i.ok)throw new R(`Failed to load font file: ${i.status} ${i.statusText}`);return i.arrayBuffer()}async Rr(e){await this.zr(e);const i=lt.parse(e);if(!i||i.length===0)throw new Error("Failed to parse font file");this.yr=i[0],await this.Hr()}async zr(e){this.Mr&&document.fonts.delete(this.Mr);const i=Date.now();this.Mr=new FontFace(`CustomFont_${i}`,e),await this.Mr.load(),document.fonts.add(this.Mr)}async Hr(){const e=this.Fr.Yi(this.yr),{array:i,map:s}=this.Tr.gr(e,this.yr);this.wr=i,this.Ar=s,this.Lr(),this.Sr=!0}Br(e){const i=this.Ar.get(e);return i?i.color:[0,0,0]}Ir(e){return Array.from(e).map(i=>{const s=this.Ar.get(i);return s?s.color:[0,0,0]})}dispose(){this.$r.Ss(),this.Mr&&document.fonts.delete(this.Mr),super.dispose()}get Gr(){return this.Sr}get fontFramebuffer(){return this.$r.framebuffer}get characterMap(){return this.Ar}get characters(){return this.wr}get textureColumns(){return this.$r.columns}get textureRows(){return this.$r.rows}get maxGlyphDimensions(){return this.Cr}get fontSize(){return this.br}get font(){return this.yr}}class Ht{constructor(t,e,i){o(this,"Nr");o(this,"tr");o(this,"M");o(this,"F");o(this,"jr");o(this,"Qr");o(this,"Xr");o(this,"Yr");o(this,"Kr");o(this,"Wr",!1);o(this,"Zr",new Set);this.Xr=t,this.Yr=e,this.Kr=i,this.reset()}qr(){if(this.M=this.Nr*this.Yr,this.F=this.tr*this.Kr,this.jr=Math.floor((this.Xr.width-this.M)/2),this.Qr=Math.floor((this.Xr.height-this.F)/2),this.Zr.size>0)for(const t of this.Zr)t()}Vr(t){this.Zr.add(t)}Jr(t){this.Zr.delete(t)}reset(){this.Wr||(this.Nr=Math.floor(this.Xr.width/this.Yr),this.tr=Math.floor(this.Xr.height/this.Kr)),this.qr()}tn(t,e){this.Yr=t,this.Kr=e,this.reset()}get cellWidth(){return this.Yr}get cellHeight(){return this.Kr}get cols(){return this.Nr}set cols(t){this.Wr=!0,this.Nr=Math.max(1,Math.floor(t)),typeof this.tr!="number"&&(this.tr=Math.max(1,Math.floor(this.Xr.height/this.Kr))),this.qr()}get rows(){return this.tr}set rows(t){this.Wr=!0,this.tr=Math.max(1,Math.floor(t)),typeof this.Nr!="number"&&(this.Nr=Math.max(1,Math.floor(this.Xr.width/this.Yr))),this.qr()}get width(){return this.M}get height(){return this.F}get offsetX(){return this.jr}get offsetY(){return this.Qr}responsive(){this.Wr=!1}sn(t,e){const i=this.Xr.getBoundingClientRect(),s=t-i.left,r=e-i.top,h=this.Xr.width/i.width,a=r*(this.Xr.height/i.height),l=s*h-this.jr,u=a-this.Qr,c=Math.floor(l/this.Yr),f=Math.floor(u/this.Kr);return c>=0&&c<this.Nr&&f>=0&&f<this.tr?{x:c-Math.floor((this.Nr-1)/2),y:f-Math.floor(this.tr/2)}:{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY}}Ss(){this.Zr.clear()}}function ct(n){return parseInt(n,16)}const Ye=/^rgba?\(([^)]+)\)$/i;function D(n){return n=Math.round(n),Number.isNaN(n)?0:U(n,0,255)}function Yt(n,t=!1){if(!n)return null;const e=n.trim().toLowerCase();if(!e)return null;let i=null;return e.startsWith("rgb")&&(i=function(s){const r=Ye.exec(s.trim());if(!r)return null;const h=r[1].split(",").map(f=>f.trim());if(h.length<3)return null;const a=D(parseFloat(h[0])),l=D(parseFloat(h[1])),u=D(parseFloat(h[2]));let c=255;if(h[3]!==void 0){const f=h[3].trim();let g=parseFloat(f);f.endsWith("%")&&(g/=100),c=255*U(g,0,1)}return[a,l,u,Math.round(c)]}(e)),i&&(t||i[3]!==0)?i:null}class zt{constructor(t={}){o(this,"Xr");o(this,"en",null);o(this,"rn",!1);o(this,"nn");o(this,"hn",null);o(this,"an",!0);o(this,"$",null);if(this.rn=t.overlay??!1,t.gl)this.hn=t.gl,this.Xr=t.gl.canvas,this.nn=!1,this.an=!1;else if(this.rn&&t.canvas)this.en=t.canvas,this.Xr=this.cn(),this.nn=!0,this.ln();else if(t.canvas){if(t.canvas instanceof HTMLVideoElement)throw new R("Video elements are only supported in overlay mode.");this.Xr=t.canvas,this.nn=!1}else this.Xr=this.un(t.width,t.height),this.nn=!0;this.Xr.style.imageRendering="pixelated"}un(t,e){const i=document.createElement("canvas");return i.className="textmodeCanvas",i.style.imageRendering="pixelated",i.width=t||800,i.height=e||600,document.body.appendChild(i),i}cn(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const e=this.en.getBoundingClientRect();let i=Math.round(e.width),s=Math.round(e.height);if(this.en instanceof HTMLVideoElement){const a=this.en;(i===0||s===0)&&a.videoWidth>0&&a.videoHeight>0&&(i=a.videoWidth,s=a.videoHeight)}t.width=i,t.height=s,t.style.position="absolute",t.style.pointerEvents="none";const r=window.getComputedStyle(this.en);let h=parseInt(r.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=(h+1).toString(),t}ln(){var t;this.fn(),(t=this.en.parentNode)==null||t.insertBefore(this.Xr,this.en.nextSibling)}dn(){const t=[];return this.rn&&this.en instanceof HTMLElement&&(t.push(this.en),this.en.parentElement&&t.push(this.en.parentElement)),this.Xr.parentElement&&t.push(this.Xr.parentElement),t.push(this.Xr),t.push(document.body),t.push(document.documentElement),t}pn(){const t=this.dn();for(const e of t){if(!e)continue;const i=Yt(window.getComputedStyle(e).backgroundColor);if(i)return i}return[255,255,255,255]}fn(){if(!this.en)return;const t=this.en.getBoundingClientRect();let e=this.en.offsetParent;if(e&&e!==document.body){const i=e.getBoundingClientRect();this.Xr.style.top=t.top-i.top+"px",this.Xr.style.left=t.left-i.left+"px"}else this.Xr.style.top=t.top+window.scrollY+"px",this.Xr.style.left=t.left+window.scrollX+"px"}vn(t,e){if(this.rn){const i=this.en.getBoundingClientRect();this.Xr.width=Math.round(i.width),this.Xr.height=Math.round(i.height),this.fn()}else this.Xr.width=t??this.Xr.width,this.Xr.height=e??this.Xr.height}gn(){if(this.hn)return this.hn;const t=this.Xr.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!0,stencil:!1,powerPreference:"high-performance"});if(!t)throw new R("`textmode.js` requires WebGL2 support.");return this.$=t,t}Ss(){if(!this.an)return;const t=this.$??this.hn;if(t){const e=t.getExtension("WEBGL_lose_context");e==null||e.loseContext()}this.nn&&this.Xr.parentNode&&this.Xr.parentNode.removeChild(this.Xr)}get canvas(){return this.Xr}get targetCanvas(){return this.en}get width(){return this.Xr.width}get height(){return this.Xr.height}get ownsContext(){return this.an}}class x{constructor(t,e,i,s){o(this,"mn");o(this,"_n");o(this,"r");o(this,"g");o(this,"b");o(this,"a");this.r=D(t),this.g=D(e),this.b=D(i),this.a=D(s)}static yn(t,e,i,s){if(x.wn(t))return t;if(Array.isArray(t)){if(t.length<3)throw new Error("Component tuples must include at least RGB values.");const[r,h,a]=t,l=t.length===4?t[3]:255;return x.An(r,h,a,l)}if(typeof t=="string"){const r=t.trim();if(r.length===0)throw new Error("Color strings cannot be empty.");const h=Yt(r,!0);return h?x.An(...h):x.bn(r)}if(typeof t=="number")return typeof e=="number"&&typeof i=="number"?x.An(t,e,i,s??255):typeof e=="number"?x.Cn(t,e):x.Cn(t,s??255);throw new Error("Unsupported color input passed to TextmodeColor.$from.")}static An(t,e,i,s=255){return new x(t,e,i,s)}static Cn(t,e=255){return new x(t,t,t,e)}static bn(t){return new x(...function(e){const i=e.trim().replace(/^#|0x/gi,"");if(!/^[0-9A-Fa-f]+$/.test(i))throw new Error(`Invalid hex color: ${e}`);const s=(r=i).length===3||r.length===4?r.split("").map(h=>h+h).join(""):r;var r;if(s.length!==6&&s.length!==8)throw new Error(`Invalid hex color: ${e}`);return[ct(s.slice(0,2)),ct(s.slice(2,4)),ct(s.slice(4,6)),s.length===8?ct(s.slice(6,8)):255]}(t))}static xn(t,e,i,s){return new x(Math.round(255*t),Math.round(255*e),Math.round(255*i),Math.round(255*s))}get rgb(){return[this.r,this.g,this.b]}get rgba(){return this.mn||(this.mn=[this.r,this.g,this.b,this.a]),[...this.mn]}get normalized(){return this._n||(this._n=[this.r/255,this.g/255,this.b/255,this.a/255]),[...this._n]}withAlpha(t){return new x(this.r,this.g,this.b,t)}static wn(t){return t instanceof x}}class Rt extends K{constructor(e,i,s,r,h,a,l,u){super();o(this,"$");o(this,"R");o(this,"Mn");o(this,"Fn");o(this,"$n");o(this,"M");o(this,"F");o(this,"D",null);o(this,"Pn",null);o(this,"Tn","brightness");o(this,"Sn",null);o(this,"En");o(this,"Rt",0);o(this,"Gt",0);o(this,"Nt",0);o(this,"Dt",0);o(this,"kn","sampled");o(this,"Rn","fixed");o(this,"Xt",[1,1,1,1]);o(this,"Yt",[0,0,0,1]);o(this,"Dn",[0,0,0,1]);o(this,"Ln",[[.1,0,0]]);o(this,"Qt",null);this.$=e,this.R=i,this.Mn=s,this.En=r,this.Fn=h,this.$n=a;const{width:c,height:f}=function(g,p,v,d){const m=Math.min(v/g,d/p);return{width:Math.max(1,Math.floor(g*m)),height:Math.max(1,Math.floor(p*m)),scale:m}}(h,a,l,u);this.M=c,this.F=f}conversionMode(e){return this.Tn=e,this.Sn=null,this.D=null,this}dispose(){this.Mn&&(this.$.deleteTexture(this.Mn),this.Mn=null),super.dispose()}invert(e=!0){return this.Rt=e?1:0,this.D=null,this}flipX(e=!0){return this.Gt=e?1:0,this.D=null,this}flipY(e=!0){return this.Nt=e?1:0,this.D=null,this}charRotation(e){return this.Dt=Mt(e),this.D=null,this}charColorMode(e){return this.kn=e,this.D=null,this}cellColorMode(e){return this.Rn=e,this.D=null,this}charColor(e,i,s,r){return this.On(this.Xt,e,i,s,r),this.D=null,this}cellColor(e,i,s,r){return this.On(this.Yt,e,i,s,r),this.D=null,this}background(e,i,s,r){return this.On(this.Dn,e,i,s,r),this.D=null,this}characters(e){return this.Qt=e,this.zn(e),this.D=null,this}Si(e){this.Pn!==e&&(this.Pn=e,this.Qt&&this.zn(this.Qt),this.D=null)}get texture(){return this.Mn}get width(){return this.M}get height(){return this.F}get originalWidth(){return this.Fn}get originalHeight(){return this.$n}V(){return this.D||this.J(),this.D}Hn(){}Bn(){return this.Mn}J(){this.Hn();const e=this.In(),i=this.Gn(),s=this.En.Nn(this.Tn,i),r=e.createUniforms(i);this.D=this.R.materialManager.st(s,r)}On(e,i,s,r,h){const a=x.yn(i,s,r,h);st(e,a.r,a.g,a.b,a.a)}zn(e){if(!this.Pn)return;const i=this.Pn.Ir(e).filter(s=>Array.isArray(s)).slice(0,255);this.Ln=i.length>0?i:this.Ln}createBaseConversionUniforms(){return{u_image:this.Bn(),u_invert:!!this.Rt,u_flipX:!!this.Gt,u_flipY:!!this.Nt,u_charRotation:this.Dt,u_charColorFixed:this.kn==="fixed",u_charColor:this.Xt,u_cellColorFixed:this.Rn==="fixed",u_cellColor:this.Yt,u_backgroundColor:this.Dn,u_charCount:this.Ln.length,u_charList:this.Ln}}In(){if(this.Sn&&this.Sn.id===this.Tn)return this.Sn;const e=this.En.jn(this.Tn);if(!e)throw new Error(`[textmode.js] Conversion mode "${this.Tn}" is not registered. If this mode is provided by an add-on, make sure its plugin is installed before loading sources.`);return this.Sn=e,e}Gn(){if(!this.Pn)throw new Error("[textmode.js] Cannot create conversion context: no active font set. Ensure $setActiveFont() is called before rendering.");return{renderer:this.R,gl:this.$,font:this.Pn,source:this}}}class Q extends Rt{constructor(t,e,i,s,r,h,a,l){super(t,e,i,s,r,h,a,l)}static Qn(t,e,i,s,r){const h=t.context,a=At(h,i),{width:l,height:u}=yt(i);return new Q(h,t,a,e,l,u,s,r)}}class kt{constructor(t=60){o(this,"Xn");o(this,"Yn");o(this,"Kn",null);o(this,"Wn",0);o(this,"Zn",!0);o(this,"qn",0);o(this,"Vn",0);o(this,"Jn",[]);o(this,"th",10);o(this,"sh",0);o(this,"eh",0);o(this,"ih",-1);this.Yn=t,this.Xn=1e3/t}rh(t){if(!this.Zn)return;this.ih===-1&&(this.ih=performance.now()),this.Wn=performance.now();const e=i=>{if(!this.Zn)return void(this.Kn=null);const s=i-this.Wn;s>=this.Xn&&(t(),this.Wn=i-s%this.Xn),this.Zn&&(this.Kn=requestAnimationFrame(e))};this.Kn=requestAnimationFrame(e)}nh(){this.Kn&&(cancelAnimationFrame(this.Kn),this.Kn=null)}hh(){this.Zn&&(this.Zn=!1,this.nh())}oh(t){this.Zn||(this.Zn=!0,this.rh(t))}ah(t,e){if(t===void 0)return this.qn;this.Yn=t,this.Xn=1e3/t,this.Zn&&e&&(this.nh(),this.rh(e))}uh(){const t=performance.now();if(this.Vn>0){const e=t-this.Vn;this.sh=e,this.Jn.push(e),this.Jn.length>this.th&&this.Jn.shift();const i=this.Jn.reduce((s,r)=>s+r,0)/this.Jn.length;this.qn=1e3/i}this.Vn=t}get fh(){return this.Zn}get dh(){return this.qn}get ph(){return this.Yn}set ph(t){this.Yn=t,this.Xn=1e3/t}get gh(){return this.eh}set gh(t){this.eh=t}mh(){this.eh++}get _h(){return this.ih===-1?0:performance.now()-this.ih}set _h(t){this.ih=performance.now()-t}get yh(){return this._h/1e3}set yh(t){this._h=1e3*t}get wh(){return this.sh}}function Gt(n,t,e){return n?n.sn(t,e):{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY}}class Wt{constructor(t,e){o(this,"Xr");o(this,"Ah");o(this,"bh",{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY});o(this,"Ch",{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY});o(this,"xh",null);o(this,"Mh",0);o(this,"Fh");o(this,"$h");o(this,"Ph");o(this,"Th");o(this,"Sh");o(this,"Eh");o(this,"kh",!1);o(this,"Rh");o(this,"Dh");o(this,"Lh");o(this,"Oh");o(this,"zh");this.Xr=t,this.Ah=e}Hh(t){const e=performance.now()+Math.max(0,t);e>this.Mh&&(this.Mh=e)}Bh(){return performance.now()<this.Mh}Ih(t){const e=this.Xr.canvas;e.style.cursor=t==null||t===""?"":t}Gh(){if(this.kh)return;const t=this.Xr.canvas;this.Fh=e=>{this.Nh(e),this.jh(e)},this.$h=()=>{this.Ch={...this.bh},this.bh.x=Number.NEGATIVE_INFINITY,this.bh.y=Number.NEGATIVE_INFINITY,this.xh=null},this.Ph=e=>{this.Nh(e),this.Qh(e)},this.Th=e=>{this.Nh(e),this.Xh(e)},this.Sh=e=>{this.Nh(e),this.Yh(e)},this.Eh=e=>{this.Nh(e),this.Kh(e)},t.addEventListener("mousemove",this.Fh,{passive:!0}),t.addEventListener("mouseleave",this.$h,{passive:!0}),t.addEventListener("mousedown",this.Ph,{passive:!0}),t.addEventListener("mouseup",this.Th,{passive:!0}),t.addEventListener("click",this.Sh,{passive:!0}),t.addEventListener("wheel",this.Eh,{passive:!1}),this.kh=!0}Wh(){if(!this.kh)return;const t=this.Xr.canvas;t.removeEventListener("mousemove",this.Fh),t.removeEventListener("mouseleave",this.$h),t.removeEventListener("mousedown",this.Ph),t.removeEventListener("mouseup",this.Th),t.removeEventListener("click",this.Sh),t.removeEventListener("wheel",this.Eh),this.kh=!1}Zh(){if(this.kh)try{if(this.xh){const t=new MouseEvent("mousemove",{clientX:this.xh.x,clientY:this.xh.y,bubbles:!1,cancelable:!1});this.Nh(t)}}catch{this.bh.x=Number.NEGATIVE_INFINITY,this.bh.y=Number.NEGATIVE_INFINITY}}qh(t){this.Rh=t}Vh(t){this.Dh=t}Jh(t){this.Lh=t}so(t){this.Oh=t}eo(t){this.zh=t}io(){return{x:this.bh.x,y:this.bh.y}}ro(t,e={}){return{position:{...this.bh},previousPosition:{...this.Ch},originalEvent:t,...e}}jh(t){this.Oh&&!this.Bh()&&this.Oh(this.ro(t))}Qh(t){this.Dh&&!this.Bh()&&this.Dh(this.ro(t,{button:t.button}))}Xh(t){this.Lh&&!this.Bh()&&this.Lh(this.ro(t,{button:t.button}))}Yh(t){this.Rh&&!this.Bh()&&this.Rh(this.ro(t,{button:t.button}))}Kh(t){this.zh&&!this.Bh()&&this.zh(this.ro(t,{delta:{x:t.deltaX,y:t.deltaY}}))}Nh(t){const e=this.Ah();this.Ch={...this.bh},this.xh={x:t.clientX,y:t.clientY};const i=Gt(e,t.clientX,t.clientY);this.bh.x=i.x,this.bh.y=i.y}}const ze=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:Wt},Symbol.toStringTag,{value:"Module"}));class jt{constructor(){o(this,"no",new Map);o(this,"ho",null);o(this,"oo",null);o(this,"ao");o(this,"co");o(this,"kh",!1);o(this,"lo");o(this,"uo");o(this,"fo",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}Gh(){this.kh||(this.ao=t=>{this.do(t)},this.co=t=>{this.po(t)},window.addEventListener("keydown",this.ao,{passive:!1}),window.addEventListener("keyup",this.co,{passive:!1}),this.kh=!0)}Wh(){this.kh&&(window.removeEventListener("keydown",this.ao),window.removeEventListener("keyup",this.co),this.kh=!1,this.no.clear(),this.ho=null,this.oo=null)}Vh(t){this.lo=t}Jh(t){this.uo=t}vo(t){const e=this.mo(t),i=this.no.get(t)||this.no.get(e);return(i==null?void 0:i.isPressed)||!1}_o(){return this.ho}yo(){return this.oo}wo(){const t=[];for(const[e,i]of this.no)i.isPressed&&t.push(e);return t}Ao(){return{ctrl:this.vo("Control"),shift:this.vo("Shift"),alt:this.vo("Alt"),meta:this.vo("Meta")}}bo(){this.no.clear(),this.ho=null,this.oo=null}do(t){const e=t.key,i=Date.now();this.no.has(e)||this.no.set(e,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const s=this.no.get(e);s.isPressed||(s.isPressed=!0,s.lastPressTime=i,this.ho=e,this.lo&&this.lo(this.ro(e,!0,t)))}ro(t,e,i){return{key:t,keyCode:i.keyCode,ctrlKey:i.ctrlKey,shiftKey:i.shiftKey,altKey:i.altKey,metaKey:i.metaKey,isPressed:e,originalEvent:i}}po(t){const e=t.key,i=Date.now();this.no.has(e)||this.no.set(e,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const s=this.no.get(e);s.isPressed=!1,s.lastReleaseTime=i,this.oo=e,this.uo&&this.uo(this.ro(e,!1,t))}mo(t){return this.fo[t]||t.toLowerCase()}}const ke=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:jt},Symbol.toStringTag,{value:"Module"}));class Vt{constructor(t,e,i){o(this,"Xr");o(this,"Co");o(this,"Ah");o(this,"xo",new Map);o(this,"Mo",new Map);o(this,"Fo",new Map);o(this,"$o",null);o(this,"Po");o(this,"To");o(this,"So");o(this,"Eo");o(this,"ko");o(this,"Ro");o(this,"kh",!1);o(this,"Do");o(this,"Lo");o(this,"Oo");o(this,"zo");o(this,"Ho");o(this,"Bo");o(this,"Io");o(this,"Go");o(this,"No");o(this,"jo");o(this,"Qo",320);o(this,"Xo",350);o(this,"Yo",10);o(this,"Ko",550);o(this,"Wo",14);o(this,"Zo",48);o(this,"qo",650);o(this,"Vo",.02);o(this,"Jo",2);o(this,"ta",600);o(this,"sa",0);o(this,"ea",null);this.Xr=t,this.Ah=e,this.Co=i;const s=this.Xr.canvas;this.Po=s.style.touchAction,this.To=s.style.userSelect,s.style.touchAction||(s.style.touchAction="none"),s.style.userSelect||(s.style.userSelect="none")}Gh(){if(this.kh)return;const t=this.Xr.canvas;this.So=e=>{this.ia(e)},this.Eo=e=>{this.ra(e)},this.ko=e=>{this.na(e)},this.Ro=e=>{this.ha(e)},t.addEventListener("touchstart",this.So,{passive:!1}),t.addEventListener("touchmove",this.Eo,{passive:!1}),t.addEventListener("touchend",this.ko,{passive:!1}),t.addEventListener("touchcancel",this.Ro,{passive:!1}),this.kh=!0}Wh(){if(!this.kh)return;const t=this.Xr.canvas;t.removeEventListener("touchstart",this.So),t.removeEventListener("touchmove",this.Eo),t.removeEventListener("touchend",this.ko),t.removeEventListener("touchcancel",this.Ro),this.kh=!1,this.$o=null,this.xo.clear(),this.Mo.clear(),this.Fo.forEach(e=>{e.longPressTimer!==null&&window.clearTimeout(e.longPressTimer)}),this.Fo.clear(),this.ea=null,this.sa=0,t.style.touchAction=this.Po,t.style.userSelect=this.To}Zh(){if(!this.Ah()||this.xo.size===0)return;const t=new Map;for(const e of this.xo.values()){const i=this.oa(e.clientX,e.clientY,e.id,e);t.set(e.id,i)}this.xo=t}aa(){return Array.from(this.xo.values()).map(t=>({...t}))}ca(t){this.Do=t}so(t){this.Lo=t}la(t){this.Oo=t}ua(t){this.zo=t}fa(t){this.Ho=t}da(t){this.Bo=t}pa(t){this.Io=t}va(t){this.Go=t}ga(t){this.No=t}ma(t){this.jo=t}ia(t){var s;if(!this.Ah())return;t.preventDefault(),(s=this.Co)==null||s.Hh(this.ta);const e=performance.now(),i=this._a(t.changedTouches);for(const r of i){const h=this.xo.get(r.id);h&&this.Mo.set(r.id,this.ya(h)),this.xo.set(r.id,r);const a={id:r.id,startPosition:r,lastPosition:r,startTime:e,lastTime:e,longPressTimer:null,longPressFired:!1};this.Io&&(a.longPressTimer=window.setTimeout(()=>{const l=this.xo.get(r.id);l&&(a.longPressFired=!0,this.Io({touch:this.ya(l),duration:performance.now()-a.startTime,originalEvent:t}))},this.Ko)),this.Fo.set(r.id,a),this.Do&&this.Do(this.wa(r,t,void 0,e))}this.xo.size===2&&this.ba()}ra(t){var s;if(!this.Ah())return;t.preventDefault(),(s=this.Co)==null||s.Hh(this.ta);const e=performance.now(),i=this._a(t.changedTouches);for(const r of i){const h=this.xo.get(r.id),a=h?this.ya(h):void 0;a&&this.Mo.set(r.id,a),this.xo.set(r.id,r);const l=this.Fo.get(r.id);l&&(l.lastPosition=r,l.lastTime=e,a)&&tt(a.clientX,a.clientY,r.clientX,r.clientY)>this.Wo&&l.longPressTimer!==null&&(window.clearTimeout(l.longPressTimer),l.longPressTimer=null),this.Lo&&this.Lo(this.wa(r,t,a,e))}this.xo.size===2?this.Ca(t):this.$o=null}na(t){if(!this.Ah())return;t.preventDefault();const e=performance.now(),i=this._a(t.changedTouches);for(const s of i){const r=this.xo.get(s.id),h=r?this.ya(r):void 0,a=this.Fo.get(s.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Oo&&this.Oo(this.wa(s,t,h,e)),a&&this.xa(a,t),this.Fo.delete(s.id),this.Mo.delete(s.id),this.xo.delete(s.id)}this.xo.size<2&&(this.$o=null)}ha(t){if(!this.Ah())return;t.preventDefault();const e=performance.now(),i=this._a(t.changedTouches);for(const s of i){const r=this.xo.get(s.id),h=r?this.ya(r):void 0,a=this.Fo.get(s.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.zo&&this.zo(this.wa(s,t,h,e)),this.Fo.delete(s.id),this.Mo.delete(s.id),this.xo.delete(s.id)}this.xo.size<2&&(this.$o=null)}_a(t){const e=[];for(let i=0;i<t.length;i+=1){const s=t.item(i);s&&e.push(this.Ma(s))}return e}Ma(t){return this.oa(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}oa(t,e,i,s){const r=Gt(this.Ah(),t,e);return{id:i,x:r.x,y:r.y,clientX:t,clientY:e,pressure:s.pressure,radiusX:s.radiusX,radiusY:s.radiusY,rotationAngle:s.rotationAngle}}wa(t,e,i,s){const r=this.Fo.get(t.id),h=Array.from(this.Mo.values()).map(u=>this.ya(u)),a=Array.from(this.xo.values()).map(u=>this.ya(u)),l=this._a(e.changedTouches);return{touch:this.ya(t),previousTouch:i?this.ya(i):void 0,touches:a,previousTouches:h,changedTouches:l,deltaTime:r?s-r.lastTime:0,originalEvent:e}}ba(){if(this.xo.size!==2)return void(this.$o=null);const t=Array.from(this.xo.values()),[e,i]=t,s=tt(e.x,e.y,i.x,i.y),r=Ft(e.clientX,e.clientY,i.clientX,i.clientY);this.$o={ids:[e.id,i.id],initialDistance:Math.max(s,1e-4),initialAngle:r,lastScale:1,lastRotation:0}}Ca(t){if(this.$o||this.ba(),!this.$o)return;const[e,i]=this.$o.ids,s=this.xo.get(e),r=this.xo.get(i);if(!s||!r)return;const h=tt(s.x,s.y,r.x,r.y)/this.$o.initialDistance,a=h-this.$o.lastScale;this.No&&Math.abs(a)>this.Vo&&(this.No({touches:[this.ya(s),this.ya(r)],scale:h,deltaScale:a,center:this.Fa(s,r),originalEvent:t}),this.$o.lastScale=h);let l=Ft(s.clientX,s.clientY,r.clientX,r.clientY)-this.$o.initialAngle;l=(l+180)%360-180;const u=l-this.$o.lastRotation;this.jo&&Math.abs(u)>this.Jo&&(this.jo({touches:[this.ya(s),this.ya(r)],rotation:l,deltaRotation:u,center:this.Fa(s,r),originalEvent:t}),this.$o.lastRotation=l)}Fa(t,e){const i=(t.clientX+e.clientX)/2,s=(t.clientY+e.clientY)/2,r=this.oa(i,s,-1,{id:-1,x:-1,y:-1,clientX:i,clientY:s});return{x:r.x,y:r.y}}xa(t,e){const i=performance.now(),s=i-t.startTime,r=t.lastPosition.clientX-t.startPosition.clientX,h=t.lastPosition.clientY-t.startPosition.clientY,a=Math.hypot(r,h);if(!t.longPressFired&&s<=this.Qo&&a<=this.Yo)this.$a(t.lastPosition,i)&&this.Bo?this.Bo({touch:this.ya(t.lastPosition),taps:2,originalEvent:e}):this.Ho&&this.Ho({touch:this.ya(t.lastPosition),taps:1,originalEvent:e});else if(!t.longPressFired&&s<=this.qo&&a>=this.Zo){const l=Math.max(a,1e-4),u={x:r/l,y:h/l},c={x:r/s,y:h/s};this.Go&&this.Go({touch:this.ya(t.lastPosition),direction:u,distance:l,velocity:c,originalEvent:e})}this.sa=i,this.ea=this.ya(t.lastPosition)}$a(t,e){return!this.ea||e-this.sa>this.Xo?!1:tt(t.clientX,t.clientY,this.ea.clientX,this.ea.clientY)<=this.Yo}ya(t){return{...t}}}const Ge=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:Vt},Symbol.toStringTag,{value:"Module"}));class $ extends Rt{constructor(e,i,s,r,h,a,l,u,c){super(e,i,s,r,h,a,l,u);o(this,"Pa");this.Pa=c}static Ta(e,i,s,r,h){const a=e.context,l=At(a,s),{width:u,height:c}=yt(s);return new $(a,e,l,i,u,c,r,h,s)}Sa(){this.Pa instanceof HTMLVideoElement?this.Pa.readyState>=this.Pa.HAVE_CURRENT_DATA&&et(this.$,this.Mn,this.Pa):et(this.$,this.Mn,this.Pa)}V(){return this.D=null,super.V()}Hn(){this.Sa()}get source(){return this.Pa}}class ut extends ${constructor(t,e,i,s,r,h,a,l,u){super(t,e,i,s,h,a,l,u,r)}dispose(){super.dispose(),this.Ea.pause(),this.Ea.src="",this.Ea.load()}ka(){this.Sa()}static async Qn(t,e,i,s,r){const h=t.context,a=document.createElement("video");a.crossOrigin="anonymous",a.loop=!0,a.muted=!0,a.playsInline=!0,await new Promise((f,g)=>{a.addEventListener("loadedmetadata",()=>f(),{once:!0}),a.addEventListener("error",p=>{var d;const v=p.target;g(new Error(`Failed to load video: ${((d=v.error)==null?void 0:d.message)||"Unknown error"}`))},{once:!0}),a.src=i});const l=At(h,a,h.LINEAR,h.LINEAR,h.CLAMP_TO_EDGE,h.CLAMP_TO_EDGE),{width:u,height:c}=yt(a);return new ut(h,t,l,e,a,u,c,s,r)}async play(){await this.Ea.play()}pause(){this.Ea.pause()}stop(){this.Ea.pause(),this.Ea.currentTime=0}speed(t){return this.Ea.playbackRate=t,this}loop(t=!0){return this.Ea.loop=t,this}time(t){return this.Ea.currentTime=t,this}volume(t){return this.Ea.volume=U(t,0,1),this}get videoElement(){return this.Ea}get currentTime(){return this.Ea.currentTime}get duration(){return this.Ea.duration}get isPlaying(){return!this.Ea.paused&&!this.Ea.ended}get Ea(){return this.Pa}}async function ft(n){if(n.startsWith("./")||n.startsWith("../")||n.endsWith(".vert")||n.endsWith(".frag")||n.endsWith(".glsl")){const t=await fetch(n);if(!t.ok)throw new Error(`Failed to load shader from ${n}: ${t.statusText}`);return await t.text()}return n}const We=n=>class extends n{rotate(t=0,e=0,i=0){this.R.state.Jt(t),this.R.state.ts(e),this.R.state.ss(i)}rotateX(t){if(t===void 0)return J(this.R.state.rotationX);this.R.state.Jt(t)}rotateY(t){if(t===void 0)return J(this.R.state.rotationY);this.R.state.ts(t)}rotateZ(t){if(t===void 0)return J(this.R.state.rotationZ);this.R.state.ss(t)}translate(t=0,e=0,i=0){this.R.state.es(t,e,i)}translateX(t){if(t===void 0)return this.R.state.translationX;this.R.state.es(t,0,0)}translateY(t){if(t===void 0)return this.R.state.translationY;this.R.state.es(0,t,0)}translateZ(t){if(t===void 0)return this.R.state.translationZ;this.R.state.es(0,0,t)}ortho(){this.R.state.ws(!0)}push(){this.R.state.K()}pop(){this.R.state.W()}color(t,e,i,s){return x.yn(t,e,i,s)}rect(t=1,e=1){this.R.ki(t,e)}point(){this.R.ki(1,1)}line(t,e,i,s){this.R.Ri(t,e,i,s)}lineWeight(t){if(t===void 0)return this.R.state.lineWeight;this.R.state.qt(t)}background(t,e,i,s=255){if(t===void 0){const[h,a,l,u]=this.R.state.canvasBackgroundColor;return x.xn(h,a,l,u)}const r=x.yn(t,e,i,s);this.R.Bi(r.r,r.g,r.b,r.a)}char(t){if(t===void 0)return this.R.state.characterString;let e;typeof t=="number"?e=this.font.characters[t].character:e=t;const i=Array.from(e);if(i.length===0)throw new Error("char() requires at least one character.");const s=i[0];this.R.state.cs(this.font.Br(s)),this.R.state.ls(s)}Xt(t,e,i,s){if(t===void 0){const[h,a,l,u]=this.R.state.charColor;return x.xn(h,a,l,u)}const r=x.yn(t,e,i,s);this.R.state.us(r.r,r.g,r.b,r.a)}charColor(t,e,i,s){return this.Xt(t,e,i,s)}stroke(t,e,i,s){return this.Xt(t,e,i,s)}Yt(t,e,i,s){if(t===void 0){const[h,a,l,u]=this.R.state.cellColor;return x.xn(h,a,l,u)}const r=x.yn(t,e,i,s);this.R.state.fs(r.r,r.g,r.b,r.a)}cellColor(t,e,i,s){return this.Yt(t,e,i,s)}fill(t,e,i,s){return this.Yt(t,e,i,s)}flipX(t){if(t===void 0)return this.R.state.flipX;this.R.state.ds(t)}flipY(t){if(t===void 0)return this.R.state.flipY;this.R.state.ps(t)}charRotation(t){if(t===void 0)return 360*this.R.state.charRotation;this.R.state.gs(t)}invert(t){if(t===void 0)return this.R.state.invert;this.R.state.vs(t)}clear(){this.R.xe(0,0,0,0)}ellipse(t=1,e=1){this.R.Di(t/2,e/2)}triangle(t,e,i,s,r,h){this.R.Li(t,e,i,s,r,h)}bezierCurve(t,e,i,s,r,h,a,l){this.R.Oi(t,e,i,s,r,h,a,l)}arc(t,e,i,s){this.R.zi(t/2,e/2,i,s)}shader(t){this.R.Fi(t)}resetShader(){this.R.$i()}setUniform(t,e){this.R._t(t,e)}setUniforms(t){this.R.gt(t)}async createFilterShader(t){const e=await ft(t),i=this.R.Pi(e);return this.Ra(i),i}async createShader(t,e){const i=await ft(t),s=await ft(e),r=this.R.Mi(i,s);return this.Ra(r),r}createFramebuffer(t){const e=this.R.Hi(t.width??this.grid.cols,t.height??this.grid.rows,t.attachments??3);return this.Ra(e),e}image(t,e,i){this.R.Ti(t,e,i,this.font),t instanceof it&&this.R.Z()}async loadImage(t){const e=t,i=await new Promise((r,h)=>{const a=new Image;a.crossOrigin="anonymous",a.onload=()=>r(a),a.onerror=l=>h(l),a.src=e}),s=Q.Qn(this.R,this.En,i,this.grid.cols,this.grid.rows);return this.Ra(s),s}async loadVideo(t){const e=await ut.Qn(this.R,this.En,t,this.grid.cols,this.grid.rows);return this.Ra(e),e}createTexture(t){const e=$.Ta(this.R,this.En,t,this.grid.cols,this.grid.rows);return this.Ra(e),e}},je=n=>class extends n{get frameCount(){return this.Da.gh}set frameCount(t){this.Da.gh=t}frameRate(t){return t===void 0?this.Da.dh:this.Da.ah(t,()=>this.La())}targetFrameRate(t){if(t===void 0)return this.Da.ph;this.Da.ph=t}noLoop(){this.Da.hh()}loop(){this.Da.oh(()=>this.La())}redraw(t=1){if(mt.m(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let e=0;e<t;e++)this.La()}isLooping(){return this.Da.fh}get millis(){return this.Da._h}set millis(t){this.Da._h=t}get secs(){return this.Da.yh}set secs(t){this.Da.yh=t}deltaTime(){return this.Da.wh}},Ve=n=>class extends n{constructor(...t){super(...t)}mouseClicked(t){this.Co.qh(t)}mousePressed(t){this.Co.Vh(t)}mouseReleased(t){this.Co.Jh(t)}mouseMoved(t){this.Co.so(t)}mouseScrolled(t){this.Co.eo(t)}get mouse(){return this.Co.io()}cursor(t){this.Co.Ih(t)}},Ze=n=>class extends n{constructor(...t){super(...t)}touchStarted(t){this.Oa.ca(t)}touchMoved(t){this.Oa.so(t)}touchEnded(t){this.Oa.la(t)}touchCancelled(t){this.Oa.ua(t)}tap(t){this.Oa.fa(t)}doubleTap(t){this.Oa.da(t)}longPress(t){this.Oa.pa(t)}swipe(t){this.Oa.va(t)}pinch(t){this.Oa.ga(t)}rotateGesture(t){this.Oa.ma(t)}get touches(){return this.Oa.aa()}},Qe=n=>class extends n{constructor(...t){super(...t)}keyPressed(t){this.za.Vh(t)}keyReleased(t){this.za.Jh(t)}isKeyPressed(t){return this.za.vo(t)}get lastKeyPressed(){return this.za._o()}get lastKeyReleased(){return this.za.yo()}get pressedKeys(){return this.za.wo()}get modifierState(){return this.za.Ao()}};class Zt{constructor(t){o(this,"Ha");o(this,"Ba",new Map);o(this,"Ia",[]);o(this,"Ga",new Map);o(this,"Na",new Map);o(this,"ja",new Map);o(this,"Qa",new Map);o(this,"Xa",new Map);o(this,"Ya",new Map);o(this,"Ka",new Map);o(this,"Wa",new Map);this.Ha=t}Za(t){for(const e of t){if(this.Ba.has(e.name))return void console.warn(`[textmode.js] Plugin "${e.name}" is already installed.`);const i=this.qa(e.name);try{const s=e.install(this.Ha,i);s instanceof Promise&&s.catch(r=>{console.error(`[textmode.js] Async plugin "${e.name}" installation error:`,r),this.Va(e.name)})}catch(s){throw this.Va(e.name),s}this.Ba.set(e.name,e),this.Ia.push(e.name)}}async Ja(t){for(const e of t){if(this.Ba.has(e.name))return void console.warn(`[textmode.js] Plugin "${e.name}" is already installed.`);const i=this.qa(e.name);try{await e.install(this.Ha,i)}catch(s){throw this.Va(e.name),s}this.Ba.set(e.name,e),this.Ia.push(e.name)}}async tc(t){const e=this.Ba.get(t);if(!e)return;const i=this.qa(t);e.uninstall&&await e.uninstall(this.Ha,i),this.Ba.delete(t),this.Ia.splice(this.Ia.indexOf(t),1),this.Va(t)}sc(){this.ec(this.Ga,t=>t())}rc(){this.ec(this.Na,t=>t())}nc(t){this.ec(this.ja,e=>e(t))}hc(t){this.ec(this.Qa,e=>e(t))}oc(t){this.ec(this.Xa,e=>e(t))}async ac(){await this.cc(this.Ya,t=>t())}async lc(){await this.cc(this.Ka,t=>t())}async uc(){const t=[...this.Ba.keys()];for(const e of t)await this.tc(e)}qa(t){const e=this.Ha,i=this;return{get renderer(){return e.R},get canvas(){return e.Xr},get layerManager(){return e.layers},get font(){return e.layers.base.font},get grid(){return e.layers.base.grid},get drawFramebuffer(){return e.layers.base.drawFramebuffer},get asciiFramebuffer(){return e.layers.base.asciiFramebuffer},registerPreDrawHook:s=>i.fc(i.Ga,t,s),registerPostDrawHook:s=>i.fc(i.Na,t,s),registerLayerDisposedHook:s=>i.fc(i.ja,t,s),registerLayerPreRenderHook:s=>i.fc(i.Qa,t,s),registerLayerPostRenderHook:s=>i.fc(i.Xa,t,s),registerPreSetupHook:s=>i.fc(i.Ya,t,s),registerPostSetupHook:s=>i.fc(i.Ka,t,s),extendLayer:(s,r)=>{i.dc(t,s,r)},removeLayerExtension:s=>{i.vc(t,s)}}}fc(t,e,i){const s=t.get(e)??new Set;return s.add(i),t.set(e,s),()=>{const r=t.get(e);r&&(r.delete(i),r.size===0&&t.delete(e))}}Va(t){this.Ga.delete(t),this.Na.delete(t),this.ja.delete(t),this.Qa.delete(t),this.Xa.delete(t),this.Ya.delete(t),this.Ka.delete(t);const e=this.Wa.get(t);if(e){for(const i of e.keys())this.gc(i);this.Wa.delete(t)}}ec(t,e){for(const i of this.Ia){const s=t.get(i);s&&s.forEach(e)}}async cc(t,e){for(const i of this.Ia){const s=t.get(i);if(s)for(const r of s)await e(r)}}dc(t,e,i){let s=this.Wa.get(t);s||(s=new Map,this.Wa.set(t,s));for(const[r,h]of this.Wa)r!==t&&h.has(e)&&console.warn(`[textmode.js] Plugin "${t}" is overwriting layer method "${e}" previously added by plugin "${r}".`);s.set(e,i),this.mc(e,i)}vc(t,e){const i=this.Wa.get(t);if(!i)return;i.delete(e);let s=!1;for(const[r,h]of this.Wa)if(r!==t&&h.has(e)){s=!0;const a=h.get(e);this.mc(e,a);break}s||this.gc(e)}mc(t,e){const i=Object.getPrototypeOf(this.Ha.layers.base);Object.defineProperty(i,t,{value:e,writable:!0,configurable:!0,enumerable:!1})}gc(t){const e=Object.getPrototypeOf(this.Ha.layers.base),i=Object.getOwnPropertyDescriptor(e,t);i&&i.configurable&&delete e[t]}}const $e=Object.freeze(Object.defineProperty({__proto__:null,TextmodePluginManager:Zt},Symbol.toStringTag,{value:"Module"})),q=`#version 300 es
11
11
  layout(location=0)in vec2 A;layout(location=1)in vec2 B;out vec2 v_uv;void main(){v_uv=B;gl_Position=vec4(A,0.,1.);}`,Qt=`#version 300 es
12
- precision highp float;uniform sampler2D u_texture;in vec2 v_uv;out vec4 fragColor;void main(){fragColor=texture(u_texture,v_uv);}`;class Zt{constructor(){o(this,"gc",new Map);o(this,"mc",[]);o(this,"_c",0);o(this,"yc",0);o(this,"wc")}get bc(){return this._c}get Cc(){if(this._c===0)return 0;let t=0;for(const e of this.mc){const i=this.gc.get(e);i&&(t+=L(i.progress,0,1)*i.weight)}return Math.min(1,t/this._c)}xc(t){this.wc=t}Mc(t,e=1){const i=`phase-${this.mc.length+1}-${Date.now()}`,s={id:i,label:t,weight:Math.max(.001,e),progress:0,status:"running"};return this.gc.set(i,s),this.mc.push(i),this._c+=s.weight,i}Fc(t,e){const i=this.gc.get(t);if(!i)return;i.progress=L(e,0,1),i.status=i.progress>=1?"complete":"running";const s=this.Cc;Math.abs(s-this.yc)>.001&&(this.yc=s,this.wc&&this.wc(s))}$c(t){const e=this.gc.get(t);e&&(e.progress=1,e.status="complete",this.Fc(t,1))}Pc(t){const e=this.gc.get(t);e&&(e.status="failed")}Tc(){return this.mc.map(t=>{const e=this.gc.get(t);return e?{id:e.id,label:e.label,weight:e.weight,progress:e.progress,status:e.status}:{id:t,label:t,weight:1,progress:0,status:"pending"}})}}class $t{constructor(t="active"){o(this,"Sc");o(this,"Ec","");o(this,"kc","");this.Sc=t}get Rc(){return this.Sc}get Dc(){return this.Sc!=="disabled"}get Lc(){return this.Sc==="active"||this.Sc==="transitioning"||this.Sc==="error"}get Oc(){return this.Ec}get zc(){return this.kc}Hc(){this.Sc!=="done"&&this.Sc!=="transitioning"||(this.Sc="active")}Bc(){this.Sc!=="disabled"&&(this.Sc="done")}Ic(){this.Sc!=="disabled"&&(this.Sc="transitioning")}Gc(){this.Sc==="transitioning"&&(this.Sc="done")}Nc(t){this.Sc!=="disabled"&&(this.Sc="error",t instanceof Error?(this.Ec=t.message,this.kc=t.stack||""):(this.Ec=t,this.kc=""))}jc(){this.Sc="disabled"}}class qt{constructor(t,e){o(this,"Qc",0);o(this,"Xc",1);o(this,"Yc");o(this,"Kc");this.Yc=t,this.Kc=e}get Wc(){return this.Xc}get Zc(){return this.Xc<1}ih(){this.Yc!=="none"&&this.Kc>0&&(this.Qc=performance.now())}j(){if(this.Yc==="none"||this.Kc===0)return this.Xc=1,!1;const t=performance.now()-this.Qc,e=Math.min(1,t/this.Kc);return e>=1?(this.Xc=0,!0):(this.Xc=1-e,!1)}js(){this.Xc=1,this.Qc=0}}function Rt(n,t){const e=n.tone??"auto";let i="dark";return e==="light"||e==="dark"?i=e:t&&(i=function(s){if(!s)return 0;const[r,h,a]=s.map(u=>u/255),l=u=>u<=.04045?u/12.92:Math.pow((u+.055)/1.055,2.4);return .2126*l(r)+.7152*l(h)+.0722*l(a)}(t)>.5?"light":"dark"),{mode:i,background:t,textColor:i==="light"?"#1A1A1A":"#F8F8F8",subtleColor:i==="light"?"#4A4A4A":"#C0C0C0"}}function Jt(n){return n.mode==="light"?["#E91E63","#9C27B0","#FF6F00"]:["#8EF9F3","#F15BB5","#FF9B71"]}function te(n,t){return n.length?n.map(e=>x.yn(e)):[t.color("#FFFFFF")]}class ee{constructor(t,e,i,s){this.qc=t,this.id=e,this.label=i,this.Vc=s}report(t){this.qc.Fc(this.id,t)}complete(){this.qc.$c(this.id)}fail(t){this.qc.Pc(this.id),this.Vc&&this.Vc(t??new Error(`Loading phase "${this.label}" failed`))}async track(t){try{const e=typeof t=="function"?await t():await t;return this.complete(),e}catch(e){throw this.fail(e instanceof Error?e:String(e)),e}}}const $e=({textmodifier:n,grid:t,progress:e,frameCount:i,message:s,palette:r,theme:h,phases:a,transitionOpacity:l,isError:u,errorMessage:c})=>{const f="|/-\\",g=Math.floor(i/6)%4,p=x.yn(h.textColor),m=Math.floor(255*l),d=n.color(p.r,p.g,p.b,m);if(n.charColor(d),n.cellColor(0,0,0,0),u){const v=x.yn(h.mode==="light"?"#D32F2F":"#FF6B6B").withAlpha(m);n.charColor(v),n.push(),n.translate(0,-2,0),n.char("X"),n.rect(1,1),n.pop();const w="SETUP ERROR",A=-Math.floor(w.length/2);n.push(),n.translate(A,0,0);for(const y of w)n.char(y),n.rect(1,1),n.translateX(1);if(n.pop(),c){const y=x.yn(h.subtleColor),b=n.color(y.r,y.g,y.b,m);n.charColor(b);const R=Math.floor(.8*t.cols),F=c.split(" "),P=[];let M="";for(const O of F)(M+" "+O).length<=R?M=M?M+" "+O:O:(M&&P.push(M),M=O);M&&P.push(M);const _=P.slice(0,3);P.length>3&&(_[2]=_[2].substring(0,R-3)+"..."),_.forEach((O,pt)=>{const ci=-Math.floor(O.length/2);n.push(),n.translate(ci,3+pt,0);for(const ui of O)n.char(ui),n.rect(1,1),n.translateX(1);n.pop()})}return}if(n.push(),n.translate(0,0,0),n.char(f[g]),n.rect(1,1),n.pop(),e>0||a.some(v=>v.status!=="pending")){const v=Math.max(6,Math.floor(.6*t.cols)),w=-Math.floor(v/2),A=Math.floor(v*e),y=r.length?r:[n.color("#FFFFFF")];n.push(),n.translate(w,3,0);for(let b=0;b<v;b++){const R=b<A?"*":".",F=y[b%y.length],P=n.color(F.r,F.g,F.b,m);n.charColor(P),n.char(R),n.rect(1,1),n.translateX(1)}n.pop()}if(s){const v=x.yn(h.subtleColor),w=n.color(v.r,v.g,v.b,m);n.charColor(w);const A=-Math.floor(s.length/2);n.push(),n.translate(A,5,0);for(const y of s)n.char(y),n.rect(1,1),n.translateX(1);n.pop()}};class dt{constructor(t,e={}){o(this,"Jc");o(this,"Wc");o(this,"tl");o(this,"sl");o(this,"el");o(this,"il");o(this,"rl");o(this,"nl");o(this,"hl");o(this,"ol");o(this,"yr");o(this,"al");o(this,"cl");o(this,"ll");o(this,"ul");o(this,"fl",()=>{});o(this,"dl",[]);o(this,"pl",new Map);this.Jc=e.visible??!0,this.Wc=e.opacity??1,this.tl=e.blendMode??"normal",this.sl=e.offsetX??0,this.el=e.offsetY??0,this.il=e.rotationZ??0,this.rl=e.fontSize??16,this.nl=e.fontSource,e.fontSource instanceof V?this.yr=e.fontSource:this.yr=new V(t,this.rl)}async vl(t){this.hl=t,this.yr.Gr||await this.yr.Er(this.nl);const e=this.yr.maxGlyphDimensions;this.ol=new Bt(this.hl.canvas.canvas,e.width,e.height);const i=this.ol;this.al=this.hl.createFramebuffer(i.cols,i.rows,3),this.cl=this.hl.createFramebuffer(i.width,i.height,1),this.ll=this.hl.createFramebuffer(i.width,i.height,1),this.ul=[this.hl.createFramebuffer(i.width,i.height,1,{depth:!1}),this.hl.createFramebuffer(i.width,i.height,1,{depth:!1})],this.ol.Vr(()=>{var s,r,h;this.al.resize(this.ol.cols,this.ol.rows),this.cl.resize(this.ol.width,this.ol.height),(s=this.ll)==null||s.resize(this.ol.width,this.ol.height),(r=this.ul)==null||r[0].resize(this.ol.width,this.ol.height),(h=this.ul)==null||h[1].resize(this.ol.width,this.ol.height)})}draw(t){this.fl=t}show(){this.Jc=!0}hide(){this.Jc=!1}opacity(t){if(t===void 0)return this.Wc;this.Wc=L(t,0,1)}blendMode(t){if(t===void 0)return this.tl;this.tl=t}offset(t,e=0){if(t===void 0)return{x:this.sl,y:this.el};this.sl=t,this.el=e}rotateZ(t){if(t===void 0)return this.il;this.il=t}filter(t,e){this.dl.push({name:t,params:e})}setPluginState(t,e){this.pl.set(t,e)}getPluginState(t){return this.pl.get(t)}hasPluginState(t){return this.pl.has(t)}deletePluginState(t){return this.pl.delete(t)}fontSize(t){if(t===void 0)return this.yr.fontSize;vt.m(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})&&this.yr.fontSize!==t&&(this.yr.Dr(t),this.ml())}async loadFont(t){if(!this.yr)throw new Error("Layer font not initialized. Ensure layer is attached before loading fonts.");return t instanceof V?(this.yr!==t&&this.yr.dispose(),this.yr=t,this.yr.Gr||await this.yr.Er()):await this.yr.Or(t),this.ml(),this.yr}Ra(t,e){if(!this.Jc||!this.al||!this.cl)return;const i=this.hl.renderer,s=this.ol;t._l.rc(this),this.al.begin(),i.state.Vt(),t.yl=this;try{this.fl.call(t)}finally{t.yl=void 0}this.al.end(),t._l.nc(this);const r=this.dl.length>0,h=r?this.ll:this.cl;h.begin(),i.xi(e),e.gt({u_characterTexture:this.yr.fontFramebuffer,u_charsetDimensions:[this.yr.textureColumns,this.yr.textureRows],U2:this.al.textures[0],U0:this.al.textures[1],U1:this.al.textures[2],U3:[s.cols,s.rows],U4:[h.width,h.height],U5:[0,0,0,0]}),i.Ei(0,0,s.width,s.height),h.end(),r&&this.hl.filterManager.wl(this.ll.textures[0],this.cl,this.dl,this.cl.width,this.cl.height,this.ul),this.dl=[]}vn(){var t;this.al&&this.cl&&((t=this.ol)==null||t.reset())}Ss(){var t,e,i,s,r,h,a;(t=this.al)==null||t.dispose(),(e=this.cl)==null||e.dispose(),(i=this.ll)==null||i.dispose(),(s=this.ul)==null||s[0].dispose(),(r=this.ul)==null||r[1].dispose(),(h=this.yr)==null||h.dispose(),(a=this.ol)==null||a.Ss()}get texture(){var t;return(t=this.cl)==null?void 0:t.textures[0]}get grid(){return this.ol}get font(){return this.yr}get width(){return this.cl?this.cl.width:0}get height(){return this.cl?this.cl.height:0}get drawFramebuffer(){return this.al}get asciiFramebuffer(){return this.cl}ml(){if(!this.ol||!this.yr)return;const t=this.yr.maxGlyphDimensions;this.ol.tn(t.width,t.height),this.al&&this.cl&&this.vn()}}const qe={message:"LOADING...",tone:"auto",transition:"fade",transitionDuration:500};class ie{constructor(t,e,i){o(this,"Oa");o(this,"l");o(this,"Al");o(this,"qc");o(this,"bl");o(this,"Cl");o(this,"xl");o(this,"Ml");o(this,"Fl",[]);o(this,"$l");o(this,"Pl",performance.now());o(this,"Tl",0);o(this,"Sl",!1);o(this,"Sr",!1);o(this,"Dl");this.Oa=t,this.l={...qe,...e??{}},this.Al=new $t("active"),this.qc=new Zt,this.bl=new qt(this.l.transition,this.l.transitionDuration),this.Cl=new Ht(60),this.$l=Rt(this.l,i);const s=Jt(this.$l);this.Fl=te(s,this.Oa),this.Ml=this.El(),this.qc.xc(r=>{r>=.999&&this.Bc()})}async Er(){if(this.Sr)return;const t=this.Oa.R,e=this.Oa.Xr;this.xl=new dt(t,{visible:!0,opacity:1,fontSize:16}),await this.xl.vl({renderer:t,canvas:e,filterManager:null,createFramebuffer:(i,s,r=1,h)=>t.Hi(i,s,r,h)}),this.Sr=!0}get Lc(){return this.Al.Lc&&this.Sl}ih(){this.Sl||(this.Sl=!0,this.Pl=performance.now(),this.Tl=0,this.Cl.ih(()=>this.kl()))}rh(){this.Sl&&(this.Sl=!1,this.Cl.rh())}vn(){this.Sr&&this.xl.vn()}Ss(){this.rh(),this.Sr&&(this.xl.Ss(),this.Sr=!1)}get progress(){return this.qc.Cc}message(t){return typeof t=="string"&&(this.l.message=t),this.l.message}addPhase(t,e=1){this.Al.Hc();const i=this.qc.Mc(t,e);return new ee(this.qc,i,t,s=>this.error(s))}Bc(){this.Al.Rc!=="error"&&(this.l.transition!=="none"&&this.l.transitionDuration>0?(this.Al.Ic(),this.bl.ih()):(this.Al.Bc(),this.rh(),this.Rl()))}Rl(){this.Dl&&this.Dl()}Ll(t){this.Dl=t}error(t){this.Al.Nc(t)}kl(){if(this.Al.Lc){if(this.Tl++,this.Al.Rc==="transitioning"&&this.bl.j())return this.Al.Gc(),this.Rl(),void this.rh();this.Ol()}}Ol(){if(!this.Sr)return;const t=this.xl,e=t.grid,i=this.Oa.R,s={textmodifier:this.Oa,grid:e,progress:this.progress,elapsedMs:performance.now()-this.Pl,frameCount:this.Tl,message:this.l.message,palette:this.Fl,theme:this.$l,phases:this.qc.Tc(),transitionOpacity:this.bl.Wc,isError:this.Al.Rc==="error",errorMessage:this.Al.Oc||void 0,errorDetails:this.Al.zc||void 0};t.draw(()=>{this.Oa.resetShader(),this.Oa.clear(),this.Oa.push();try{this.Ml(s)}finally{this.Oa.pop()}}),t.Ra(this.Oa,this.Oa.zl);const r=t.texture;r&&(i.xe(...i.state.canvasBackgroundColor),i.xi(this.Oa.Hl),this.Oa.Hl.gt({u_texture:r}),i.Ei(e.offsetX,e.offsetY,e.width,e.height))}Bl(t){this.$l=Rt(this.l,t)}El(){const t=this.l.renderer||$e;return e=>{t(e),this.Il(e)}}Il(t){const{textmodifier:e,grid:i,frameCount:s,theme:r,transitionOpacity:h}=t,a=[116,101,120,116,109,111,100,101,46,106,115].map(f=>String.fromCharCode(f)).join(""),l=(i.rows+1>>1)-2,u=2-(i.cols+1>>1),c=r.mode==="light"?[[233,30,99],[156,39,176],[255,111,0]]:[[142,249,243],[241,91,181],[255,155,113]];e.push(),e.translate(u,l,0);for(let f=0;f<a.length;f++){const g=a[f],p=Math.floor(.1*s+.5*f)%c.length,[m,d,v]=c[p],w=Math.floor(255*h),A=e.color(m,d,v,w);e.charColor(A),e.char(g),e.point(),e.translateX(1)}e.pop()}}const se={normal:0,additive:1,multiply:2,screen:3,subtract:4,darken:5,lighten:6,overlay:7,softLight:8,hardLight:9,colorDodge:10,colorBurn:11,difference:12,exclusion:13};class re{constructor(t,e,i){o(this,"R");o(this,"Gl");o(this,"ul");o(this,"Nl",0);this.R=t,this.Gl=t.Mi($,`#version 300 es
13
- precision highp float;uniform sampler2D Ue;uniform sampler2D Uf;uniform vec2 Ug;uniform vec2 Uh;uniform vec2 Ui;uniform float Uj;uniform float Uk;uniform int Ul;in vec2 v_uv;out vec4 fragColor;const int A=0;const int B=1;const int C=2;const int D=3;const int E=4;const int F=5;const int G=6;const int H=7;const int I=8;const int J=9;const int K=10;const int L=11;const int M=12;const int N=13;vec3 O(vec3 P,vec3 Q){return Q;}vec3 R(vec3 P,vec3 Q){return P+Q;}vec3 S(vec3 P,vec3 Q){return P*Q;}vec3 T(vec3 P,vec3 Q){return 1.-(1.-P)*(1.-Q);}vec3 U(vec3 P,vec3 Q){return max(P-Q,0.);}vec3 V(vec3 P,vec3 Q){return min(P,Q);}vec3 W(vec3 P,vec3 Q){return max(P,Q);}vec3 X(vec3 P,vec3 Q){return mix(2.*P*Q,1.-2.*(1.-P)*(1.-Q),step(0.5,P));}vec3 Y(vec3 P,vec3 Q){return mix(P-(1.-2.*Q)*P*(1.-P),mix(P+(2.*Q-1.)*(P*(3.-2.*P)-P),P+(2.*Q-1.)*(sqrt(P)-P),step(0.25,P)),step(0.5,Q));}vec3 Z(vec3 P,vec3 Q){return mix(2.*P*Q,1.-2.*(1.-P)*(1.-Q),step(0.5,Q));}vec3 a(vec3 P,vec3 Q){return mix(min(vec3(1.),P/max(1.-Q,0.0001)),vec3(1.),step(1.,Q));}vec3 b(vec3 P,vec3 Q){return mix(1.-min(vec3(1.),(1.-P)/max(Q,0.0001)),vec3(0.),step(Q,vec3(0.)));}vec3 c(vec3 P,vec3 Q){return abs(P-Q);}vec3 d(vec3 P,vec3 Q){return P+Q-2.*P*Q;}vec3 e(int f,vec3 P,vec3 Q){if(f==A)return O(P,Q);if(f==B)return R(P,Q);if(f==C)return S(P,Q);if(f==D)return T(P,Q);if(f==E)return U(P,Q);if(f==F)return V(P,Q);if(f==G)return W(P,Q);if(f==H)return X(P,Q);if(f==I)return Y(P,Q);if(f==J)return Z(P,Q);if(f==K)return a(P,Q);if(f==L)return b(P,Q);if(f==M)return c(P,Q);if(f==N)return d(P,Q);return O(P,Q);}void main(){vec4 g=texture(Uf,v_uv);vec2 h=v_uv*Ug;vec2 i=h-Ui;vec2 j=Uh*0.5;vec2 k=i-j;float l=cos(-Uk);float m=sin(-Uk);vec2 n=vec2(k.x*l-k.y*m,k.x*m+k.y*l);i=n+j;bool o=any(lessThan(i,vec2(0.)))||any(greaterThanEqual(i,Uh));if(o){fragColor=g;return;}vec2 p=(floor(i)+0.5)/Uh;vec4 q=texture(Ue,p);float r=q.a*Uj;if(r<=0.){fragColor=g;return;}vec3 s=e(Ul,g.rgb,q.rgb);vec3 t=mix(g.rgb,s,r);float u=g.a+r*(1.-g.a);fragColor=vec4(t,u);}`),this.ul=[this.R.Hi(e,i,1),this.R.Hi(e,i,1)]}jl(t){const e=this.R.context,{base:i,targetFramebuffer:s,backgroundColor:r,layers:h,canvasWidth:a,canvasHeight:l}=t,u=e.isEnabled(e.DEPTH_TEST),c=e.getParameter(e.DEPTH_WRITEMASK);u&&e.disable(e.DEPTH_TEST),c&&e.depthMask(!1);const f=this.ul[0];f.begin(),this.R.xe(...r),f.end(),this.Nl=0,i.layer.Jc&&this.Ql(i.texture,a,l,i.width,i.height,i.layer.Wc,i.offsetX,i.offsetY,i.layer.il,"normal");for(const g of h){const p=g.layer;p.Jc&&this.Ql(g.texture,a,l,g.width,g.height,p.Wc,g.offsetX,g.offsetY,p.il,p.tl)}this.Xl(s,a,l),e.depthMask(c),u&&e.enable(e.DEPTH_TEST)}Ql(t,e,i,s,r,h,a,l,u,c){const f=this.ul[this.Nl],g=this.Nl===0?1:0,p=this.ul[g],m=B(u);p.begin(),this.R.xi(this.Gl),this.Gl.gt({Ue:t,Uf:f.textures[0],Ug:[e,i],Uh:[s,r],Ui:[a,l],Uj:h,Uk:m,Ul:se[c]}),this.R.Ei(0,0,f.width,f.height),p.end(),this.Nl=g}Xl(t,e,i){const s=this.ul[this.Nl];t.begin(),this.R.xi(this.Gl),this.Gl.gt({Ue:s.textures[0],Uf:s.textures[0],Ug:[e,i],Uh:[s.width,s.height],Ui:[0,0],Uj:1,Uk:0,Ul:se.normal}),this.R.Ei(0,0,e,i),t.end()}vn(t,e){this.ul[0].resize(t,e),this.ul[1].resize(t,e)}Ss(){this.Gl.dispose(),this.ul[0].dispose(),this.ul[1].dispose()}}class Je{constructor(t={}){o(this,"Yl",[]);o(this,"Kl",[]);o(this,"Wl",!1);o(this,"l");this.l=t}async initialize(t){var e,i;for(const s of this.Kl)t&&await t(s),this.Yl.push(s),(i=(e=this.l).onAdd)==null||i.call(e,s);this.Kl=[],this.Wl=!0}get isReady(){return this.Wl}add(t){var e,i;return this.Wl?(this.Yl.push(t),(i=(e=this.l).onAdd)==null||i.call(e,t)):this.Kl.push(t),t}addMany(t){for(const e of t)this.add(e);return t}remove(t){const e=this.Yl.indexOf(t);if(e!==-1)return this.Yl.splice(e,1),this.Zl(t),!0;const i=this.Kl.indexOf(t);return i!==-1&&(this.Kl.splice(i,1),this.Zl(t),!0)}removeAt(t){if(t<0||t>=this.Yl.length)return;const[e]=this.Yl.splice(t,1);return this.Zl(e),e}move(t,e){var r,h;const i=this.Yl.indexOf(t);if(i!==-1){this.Yl.splice(i,1);const a=L(e,0,this.Yl.length);return this.Yl.splice(a,0,t),(h=(r=this.l).onMove)==null||h.call(r,t,i,a),!0}const s=this.Kl.indexOf(t);if(s!==-1){this.Kl.splice(s,1);const a=L(e,0,this.Kl.length);return this.Kl.splice(a,0,t),!0}return!1}swap(t,e){var a,l;if(t===e)return!0;const i=this.Yl.indexOf(t),s=this.Yl.indexOf(e);if(i!==-1&&s!==-1)return this.Yl[i]=e,this.Yl[s]=t,(l=(a=this.l).onSwap)==null||l.call(a,t,e,i,s),!0;const r=this.Kl.indexOf(t),h=this.Kl.indexOf(e);return r!==-1&&h!==-1&&(this.Kl[r]=e,this.Kl[h]=t,!0)}clear(){for(const t of this.Yl)this.Zl(t);this.Yl=[];for(const t of this.Kl)this.Zl(t);this.Kl=[]}dispose(){this.clear(),this.Wl=!1}get all(){return this.Yl}get pending(){return this.Kl}get length(){return this.Yl.length}get totalLength(){return this.Yl.length+this.Kl.length}get isEmpty(){return this.Yl.length===0}get(t){return this.Yl[t]}get first(){return this.Yl[0]}get last(){return this.Yl[this.Yl.length-1]}indexOf(t){return this.Yl.indexOf(t)}has(t){return this.Yl.includes(t)||this.Kl.includes(t)}[Symbol.iterator](){return this.Yl[Symbol.iterator]()}Zl(t){var e,i,s,r;(i=(e=this.l).onRemove)==null||i.call(e,t),(r=(s=this.l).onDispose)==null||r.call(s,t)}}class ne{constructor(t){o(this,"R");o(this,"ql",new Map);o(this,"Vl",new Map);o(this,"Ke");o(this,"ul");o(this,"Sr",!1);this.R=t,this.Ke=t.Mi($,Qt),this.Jl()}async register(t,e,i={}){const s=Object.entries(i),r=s.length>0?s[0][1][0]:null;let h;if(typeof e=="string"){const l=await ft(e);h=this.R.Mi($,l),this.Vl.set(t,h)}else h=e,this.Vl.set(t,h);const a={id:t,createShader:()=>h,createUniforms:(l,u)=>{const c={u_resolution:[u.width,u.height]};for(const[f,[g,p]]of s){let m=p;if(l!=null){if(typeof l=="number"&&g===r)m=l;else if(typeof l=="object"&&g in l){const d=l[g];Ot(d)&&(m=d)}}c[f]=m}return c}};this.ql.set(t,a)}unregister(t){const e=this.Vl.get(t);return e&&(e.dispose(),this.Vl.delete(t)),this.ql.delete(t)}has(t){return this.ql.has(t)}Er(t,e){this.Sr||(this.ul=[this.R.Hi(t,e,1,{depth:!1}),this.R.Hi(t,e,1,{depth:!1})],this.Sr=!0)}tu(t,e,i,s,r){this.ul[0].width===s&&this.ul[0].height===r||(this.ul[0].resize(s,r),this.ul[1].resize(s,r)),this.wl(t,e,i,s,r,this.ul)}wl(t,e,i,s,r,h){if(i.length===0)return void this.su(t,e,s,r);this.su(t,h[0],s,r);let a=0;for(let l=0;l<i.length;l++){const u=i[l],c=l===i.length-1,f=a===0?1:0,g=c?e:h[f];this.eu(u,h[a],g,s,r),c||(a=f)}}eu(t,e,i,s,r){const h=this.ql.get(t.name);if(!h)return console.warn(`[textmode.js] Unknown filter: "${t.name}". Skipping.`),void this.su(e.textures[0],i,s,r);const a=this.iu(t.name,h,s,r),l={renderer:this.R,gl:this.R.context,width:s,height:r};i.begin(),this.R.xi(a),a.gt({u_texture:e.textures[0]});const u=h.createUniforms(t.params,l);a.gt(u),this.R.Ei(0,0,s,r),i.end()}iu(t,e,i,s){let r=this.Vl.get(t);if(!r&&e){const h={renderer:this.R,gl:this.R.context,width:i,height:s};r=e.createShader(h),this.Vl.set(t,r)}return r}su(t,e,i,s){e.begin(),this.R.xi(this.Ke),this.Ke.gt({u_texture:t,u_resolution:[i,s]}),this.R.Ei(0,0,i,s),e.end()}vn(t,e){this.ul&&(this.ul[0].resize(t,e),this.ul[1].resize(t,e))}Ss(){for(const t of this.Vl.values())t.dispose();this.Vl.clear(),this.ql.clear(),this.Ke.dispose(),this.ul&&(this.ul[0].dispose(),this.ul[1].dispose()),this.Sr=!1}Jl(){this.register("invert",`#version 300 es
12
+ precision highp float;uniform sampler2D u_texture;in vec2 v_uv;out vec4 fragColor;void main(){fragColor=texture(u_texture,v_uv);}`;class $t{constructor(){o(this,"_c",new Map);o(this,"yc",[]);o(this,"wc",0);o(this,"bc",0);o(this,"Cc")}get xc(){return this.wc}get Mc(){if(this.wc===0)return 0;let t=0;for(const e of this.yc){const i=this._c.get(e);i&&(t+=U(i.progress,0,1)*i.weight)}return Math.min(1,t/this.wc)}Fc(t){this.Cc=t}$c(t,e=1){const i=`phase-${this.yc.length+1}-${Date.now()}`,s={id:i,label:t,weight:Math.max(.001,e),progress:0,status:"running"};return this._c.set(i,s),this.yc.push(i),this.wc+=s.weight,i}Pc(t,e){const i=this._c.get(t);if(!i)return;i.progress=U(e,0,1),i.status=i.progress>=1?"complete":"running";const s=this.Mc;Math.abs(s-this.bc)>.001&&(this.bc=s,this.Cc&&this.Cc(s))}Tc(t){const e=this._c.get(t);e&&(e.progress=1,e.status="complete",this.Pc(t,1))}Sc(t){const e=this._c.get(t);e&&(e.status="failed")}Ec(){return this.yc.map(t=>{const e=this._c.get(t);return e?{id:e.id,label:e.label,weight:e.weight,progress:e.progress,status:e.status}:{id:t,label:t,weight:1,progress:0,status:"pending"}})}}class qt{constructor(t="active"){o(this,"kc");o(this,"Rc","");o(this,"Dc","");this.kc=t}get Lc(){return this.kc}get Oc(){return this.kc!=="disabled"}get zc(){return this.kc==="active"||this.kc==="transitioning"||this.kc==="error"}get Hc(){return this.Rc}get Bc(){return this.Dc}Ic(){this.kc!=="done"&&this.kc!=="transitioning"||(this.kc="active")}Gc(){this.kc!=="disabled"&&(this.kc="done")}Nc(){this.kc!=="disabled"&&(this.kc="transitioning")}jc(){this.kc==="transitioning"&&(this.kc="done")}Qc(t){this.kc!=="disabled"&&(this.kc="error",t instanceof Error?(this.Rc=t.message,this.Dc=t.stack||""):(this.Rc=t,this.Dc=""))}Xc(){this.kc="disabled"}}class Kt{constructor(t,e){o(this,"Yc",0);o(this,"Kc",1);o(this,"Wc");o(this,"Zc");this.Wc=t,this.Zc=e}get qc(){return this.Kc}get Vc(){return this.Kc<1}rh(){this.Wc!=="none"&&this.Zc>0&&(this.Yc=performance.now())}j(){if(this.Wc==="none"||this.Zc===0)return this.Kc=1,!1;const t=performance.now()-this.Yc,e=Math.min(1,t/this.Zc);return e>=1?(this.Kc=0,!0):(this.Kc=1-e,!1)}js(){this.Kc=1,this.Yc=0}}function Tt(n,t){const e=n.tone??"auto";let i="dark";return e==="light"||e==="dark"?i=e:t&&(i=function(s){if(!s)return 0;const[r,h,a]=s.map(u=>u/255),l=u=>u<=.04045?u/12.92:Math.pow((u+.055)/1.055,2.4);return .2126*l(r)+.7152*l(h)+.0722*l(a)}(t)>.5?"light":"dark"),{mode:i,background:t,textColor:i==="light"?"#1A1A1A":"#F8F8F8",subtleColor:i==="light"?"#4A4A4A":"#C0C0C0"}}function Jt(n){return n.mode==="light"?["#E91E63","#9C27B0","#FF6F00"]:["#8EF9F3","#F15BB5","#FF9B71"]}function te(n,t){return n.length?n.map(e=>x.yn(e)):[t.color("#FFFFFF")]}class ee{constructor(t,e,i,s){this.Jc=t,this.id=e,this.label=i,this.tl=s}report(t){this.Jc.Pc(this.id,t)}complete(){this.Jc.Tc(this.id)}fail(t){this.Jc.Sc(this.id),this.tl&&this.tl(t??new Error(`Loading phase "${this.label}" failed`))}async track(t){try{const e=typeof t=="function"?await t():await t;return this.complete(),e}catch(e){throw this.fail(e instanceof Error?e:String(e)),e}}}const qe=({textmodifier:n,grid:t,progress:e,frameCount:i,message:s,palette:r,theme:h,phases:a,transitionOpacity:l,isError:u,errorMessage:c})=>{const f="|/-\\",g=Math.floor(i/6)%4,p=x.yn(h.textColor),v=Math.floor(255*l),d=n.color(p.r,p.g,p.b,v);if(n.charColor(d),n.cellColor(0,0,0,0),u){const m=x.yn(h.mode==="light"?"#D32F2F":"#FF6B6B").withAlpha(v);n.charColor(m),n.push(),n.translate(0,-2,0),n.char("X"),n.rect(1,1),n.pop();const w="SETUP ERROR",A=-Math.floor(w.length/2);n.push(),n.translate(A,0,0);for(const y of w)n.char(y),n.rect(1,1),n.translateX(1);if(n.pop(),c){const y=x.yn(h.subtleColor),b=n.color(y.r,y.g,y.b,v);n.charColor(b);const T=Math.floor(.8*t.cols),F=c.split(" "),S=[];let M="";for(const X of F)(M+" "+X).length<=T?M=M?M+" "+X:X:(M&&S.push(M),M=X);M&&S.push(M);const I=S.slice(0,3);S.length>3&&(I[2]=I[2].substring(0,T-3)+"..."),I.forEach((X,pt)=>{const ci=-Math.floor(X.length/2);n.push(),n.translate(ci,3+pt,0);for(const ui of X)n.char(ui),n.rect(1,1),n.translateX(1);n.pop()})}return}if(n.push(),n.translate(0,0,0),n.char(f[g]),n.rect(1,1),n.pop(),e>0||a.some(m=>m.status!=="pending")){const m=Math.max(6,Math.floor(.6*t.cols)),w=-Math.floor(m/2),A=Math.floor(m*e),y=r.length?r:[n.color("#FFFFFF")];n.push(),n.translate(w,3,0);for(let b=0;b<m;b++){const T=b<A?"*":".",F=y[b%y.length],S=n.color(F.r,F.g,F.b,v);n.charColor(S),n.char(T),n.rect(1,1),n.translateX(1)}n.pop()}if(s){const m=x.yn(h.subtleColor),w=n.color(m.r,m.g,m.b,v);n.charColor(w);const A=-Math.floor(s.length/2);n.push(),n.translate(A,5,0);for(const y of s)n.char(y),n.rect(1,1),n.translateX(1);n.pop()}};class dt{constructor(t,e={}){o(this,"sl");o(this,"qc");o(this,"el");o(this,"il");o(this,"rl");o(this,"nl");o(this,"hl");o(this,"ol");o(this,"al");o(this,"cl");o(this,"yr");o(this,"ll");o(this,"ul");o(this,"fl");o(this,"dl");o(this,"pl",()=>{});o(this,"vl",[]);o(this,"ml",new Map);this.sl=e.visible??!0,this.qc=e.opacity??1,this.el=e.blendMode??"normal",this.il=e.offsetX??0,this.rl=e.offsetY??0,this.nl=e.rotationZ??0,this.hl=e.fontSize??16,this.ol=e.fontSource,e.fontSource instanceof W?this.yr=e.fontSource:this.yr=new W(t,this.hl)}async _l(t){this.al=t,this.yr.Gr||await this.yr.Er(this.ol);const e=this.yr.maxGlyphDimensions;this.cl=new Ht(this.al.canvas.canvas,e.width,e.height);const i=this.cl;this.ll=this.al.createFramebuffer(i.cols,i.rows,3),this.ul=this.al.createFramebuffer(i.width,i.height,1),this.fl=this.al.createFramebuffer(i.width,i.height,1),this.dl=[this.al.createFramebuffer(i.width,i.height,1,{depth:!1}),this.al.createFramebuffer(i.width,i.height,1,{depth:!1})],this.cl.Vr(()=>{var s,r,h;this.ll.resize(this.cl.cols,this.cl.rows),this.ul.resize(this.cl.width,this.cl.height),(s=this.fl)==null||s.resize(this.cl.width,this.cl.height),(r=this.dl)==null||r[0].resize(this.cl.width,this.cl.height),(h=this.dl)==null||h[1].resize(this.cl.width,this.cl.height)})}draw(t){this.pl=t}show(){this.sl=!0}hide(){this.sl=!1}opacity(t){if(t===void 0)return this.qc;this.qc=U(t,0,1)}blendMode(t){if(t===void 0)return this.el;this.el=t}offset(t,e=0){if(t===void 0)return{x:this.il,y:this.rl};this.il=t,this.rl=e}rotateZ(t){if(t===void 0)return this.nl;this.nl=t}filter(t,e){this.vl.push({name:t,params:e})}setPluginState(t,e){this.ml.set(t,e)}getPluginState(t){return this.ml.get(t)}hasPluginState(t){return this.ml.has(t)}deletePluginState(t){return this.ml.delete(t)}fontSize(t){if(t===void 0)return this.yr.fontSize;mt.m(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})&&this.yr.fontSize!==t&&(this.yr.Dr(t),this.yl())}async loadFont(t){if(!this.yr)throw new Error("Layer font not initialized. Ensure layer is attached before loading fonts.");return t instanceof W?(this.yr!==t&&this.yr.dispose(),this.yr=t,this.yr.Gr||await this.yr.Er()):await this.yr.Or(t),this.yl(),this.yr}La(t,e){if(!this.sl||!this.ll||!this.ul)return;const i=this.al.renderer,s=this.cl;t.wl.hc(this),this.ll.begin(),i.state.Vt(),t.Al=this;try{this.pl.call(t)}finally{t.Al=void 0}this.ll.end(),t.wl.oc(this);const r=this.vl.length>0,h=r?this.fl:this.ul;h.begin(),i.xi(e),e.gt({u_characterTexture:this.yr.fontFramebuffer,u_charsetDimensions:[this.yr.textureColumns,this.yr.textureRows],U2:this.ll.textures[0],U0:this.ll.textures[1],U1:this.ll.textures[2],U3:[s.cols,s.rows],U4:[h.width,h.height],U5:[0,0,0,0]}),i.Ei(0,0,s.width,s.height),h.end(),r&&this.al.filterManager.bl(this.fl.textures[0],this.ul,this.vl,this.ul.width,this.ul.height,this.dl),this.vl=[]}vn(){var t;this.ll&&this.ul&&((t=this.cl)==null||t.reset())}Ss(){var t,e,i,s,r,h,a;(t=this.ll)==null||t.dispose(),(e=this.ul)==null||e.dispose(),(i=this.fl)==null||i.dispose(),(s=this.dl)==null||s[0].dispose(),(r=this.dl)==null||r[1].dispose(),(h=this.yr)==null||h.dispose(),(a=this.cl)==null||a.Ss()}get texture(){var t;return(t=this.ul)==null?void 0:t.textures[0]}get grid(){return this.cl}get font(){return this.yr}get width(){return this.ul?this.ul.width:0}get height(){return this.ul?this.ul.height:0}get drawFramebuffer(){return this.ll}get asciiFramebuffer(){return this.ul}yl(){if(!this.cl||!this.yr)return;const t=this.yr.maxGlyphDimensions;this.cl.tn(t.width,t.height),this.ll&&this.ul&&this.vn()}}const Ke={message:"LOADING...",tone:"auto",transition:"fade",transitionDuration:500};class ie{constructor(t,e,i){o(this,"Ha");o(this,"l");o(this,"Cl");o(this,"Jc");o(this,"xl");o(this,"Ml");o(this,"Fl");o(this,"$l");o(this,"Pl",[]);o(this,"Tl");o(this,"Sl",performance.now());o(this,"El",0);o(this,"kl",!1);o(this,"Sr",!1);o(this,"Ol");this.Ha=t,this.l={...Ke,...e??{}},this.Cl=new qt("active"),this.Jc=new $t,this.xl=new Kt(this.l.transition,this.l.transitionDuration),this.Ml=new kt(60),this.Tl=Tt(this.l,i);const s=Jt(this.Tl);this.Pl=te(s,this.Ha),this.$l=this.Rl(),this.Jc.Fc(r=>{r>=.999&&this.Gc()})}async Er(){if(this.Sr)return;const t=this.Ha.R,e=this.Ha.Xr;this.Fl=new dt(t,{visible:!0,opacity:1,fontSize:16}),await this.Fl._l({renderer:t,canvas:e,filterManager:null,createFramebuffer:(i,s,r=1,h)=>t.Hi(i,s,r,h)}),this.Sr=!0}get zc(){return this.Cl.zc&&this.kl}rh(){this.kl||(this.kl=!0,this.Sl=performance.now(),this.El=0,this.Ml.rh(()=>this.Dl()))}nh(){this.kl&&(this.kl=!1,this.Ml.nh())}vn(){this.Sr&&this.Fl.vn()}Ss(){this.nh(),this.Sr&&(this.Fl.Ss(),this.Sr=!1)}get progress(){return this.Jc.Mc}message(t){return typeof t=="string"&&(this.l.message=t),this.l.message}addPhase(t,e=1){this.Cl.Ic();const i=this.Jc.$c(t,e);return new ee(this.Jc,i,t,s=>this.error(s))}Gc(){this.Cl.Lc!=="error"&&(this.l.transition!=="none"&&this.l.transitionDuration>0?(this.Cl.Nc(),this.xl.rh()):(this.Cl.Gc(),this.nh(),this.Ll()))}Ll(){this.Ol&&this.Ol()}zl(t){this.Ol=t}error(t){this.Cl.Qc(t)}Dl(){if(this.Cl.zc){if(this.El++,this.Cl.Lc==="transitioning"&&this.xl.j())return this.Cl.jc(),this.Ll(),void this.nh();this.Hl()}}Hl(){if(!this.Sr)return;const t=this.Fl,e=t.grid,i=this.Ha.R,s={textmodifier:this.Ha,grid:e,progress:this.progress,elapsedMs:performance.now()-this.Sl,frameCount:this.El,message:this.l.message,palette:this.Pl,theme:this.Tl,phases:this.Jc.Ec(),transitionOpacity:this.xl.qc,isError:this.Cl.Lc==="error",errorMessage:this.Cl.Hc||void 0,errorDetails:this.Cl.Bc||void 0};t.draw(()=>{this.Ha.resetShader(),this.Ha.clear(),this.Ha.push();try{this.$l(s)}finally{this.Ha.pop()}}),t.La(this.Ha,this.Ha.Bl);const r=t.texture;r&&(i.xe(...i.state.canvasBackgroundColor),i.xi(this.Ha.Il),this.Ha.Il.gt({u_texture:r}),i.Ei(e.offsetX,e.offsetY,e.width,e.height))}Gl(t){this.Tl=Tt(this.l,t)}Rl(){const t=this.l.renderer||qe;return e=>{t(e),this.Nl(e)}}Nl(t){const{textmodifier:e,grid:i,frameCount:s,theme:r,transitionOpacity:h}=t,a=[116,101,120,116,109,111,100,101,46,106,115].map(f=>String.fromCharCode(f)).join(""),l=(i.rows+1>>1)-2,u=2-(i.cols+1>>1),c=r.mode==="light"?[[233,30,99],[156,39,176],[255,111,0]]:[[142,249,243],[241,91,181],[255,155,113]];e.push(),e.translate(u,l,0);for(let f=0;f<a.length;f++){const g=a[f],p=Math.floor(.1*s+.5*f)%c.length,[v,d,m]=c[p],w=Math.floor(255*h),A=e.color(v,d,m,w);e.charColor(A),e.char(g),e.point(),e.translateX(1)}e.pop()}}const se={normal:0,additive:1,multiply:2,screen:3,subtract:4,darken:5,lighten:6,overlay:7,softLight:8,hardLight:9,colorDodge:10,colorBurn:11,difference:12,exclusion:13};class re{constructor(t,e,i){o(this,"R");o(this,"jl");o(this,"dl");o(this,"Ql",0);this.R=t,this.jl=t.Mi(q,`#version 300 es
13
+ precision highp float;uniform sampler2D Uj;uniform sampler2D Uk;uniform vec2 Ul;uniform vec2 Um;uniform vec2 Un;uniform float Uo;uniform float Up;uniform int Uq;in vec2 v_uv;out vec4 fragColor;const int A=0;const int B=1;const int C=2;const int D=3;const int E=4;const int F=5;const int G=6;const int H=7;const int I=8;const int J=9;const int K=10;const int L=11;const int M=12;const int N=13;vec3 O(vec3 P,vec3 Q){return Q;}vec3 R(vec3 P,vec3 Q){return P+Q;}vec3 S(vec3 P,vec3 Q){return P*Q;}vec3 T(vec3 P,vec3 Q){return 1.-(1.-P)*(1.-Q);}vec3 U(vec3 P,vec3 Q){return max(P-Q,0.);}vec3 V(vec3 P,vec3 Q){return min(P,Q);}vec3 W(vec3 P,vec3 Q){return max(P,Q);}vec3 X(vec3 P,vec3 Q){return mix(2.*P*Q,1.-2.*(1.-P)*(1.-Q),step(0.5,P));}vec3 Y(vec3 P,vec3 Q){return mix(P-(1.-2.*Q)*P*(1.-P),mix(P+(2.*Q-1.)*(P*(3.-2.*P)-P),P+(2.*Q-1.)*(sqrt(P)-P),step(0.25,P)),step(0.5,Q));}vec3 Z(vec3 P,vec3 Q){return mix(2.*P*Q,1.-2.*(1.-P)*(1.-Q),step(0.5,Q));}vec3 a(vec3 P,vec3 Q){return mix(min(vec3(1.),P/max(1.-Q,0.0001)),vec3(1.),step(1.,Q));}vec3 b(vec3 P,vec3 Q){return mix(1.-min(vec3(1.),(1.-P)/max(Q,0.0001)),vec3(0.),step(Q,vec3(0.)));}vec3 c(vec3 P,vec3 Q){return abs(P-Q);}vec3 d(vec3 P,vec3 Q){return P+Q-2.*P*Q;}vec3 e(int f,vec3 P,vec3 Q){if(f==A)return O(P,Q);if(f==B)return R(P,Q);if(f==C)return S(P,Q);if(f==D)return T(P,Q);if(f==E)return U(P,Q);if(f==F)return V(P,Q);if(f==G)return W(P,Q);if(f==H)return X(P,Q);if(f==I)return Y(P,Q);if(f==J)return Z(P,Q);if(f==K)return a(P,Q);if(f==L)return b(P,Q);if(f==M)return c(P,Q);if(f==N)return d(P,Q);return O(P,Q);}void main(){vec4 g=texture(Uk,v_uv);vec2 h=v_uv*Ul;vec2 i=h-Un;vec2 j=Um*0.5;vec2 k=i-j;float l=cos(-Up);float m=sin(-Up);vec2 n=vec2(k.x*l-k.y*m,k.x*m+k.y*l);i=n+j;bool o=any(lessThan(i,vec2(0.)))||any(greaterThanEqual(i,Um));if(o){fragColor=g;return;}vec2 p=(floor(i)+0.5)/Um;vec4 q=texture(Uj,p);float r=q.a*Uo;if(r<=0.){fragColor=g;return;}vec3 s=e(Uq,g.rgb,q.rgb);vec3 t=mix(g.rgb,s,r);float u=g.a+r*(1.-g.a);fragColor=vec4(t,u);}`),this.dl=[this.R.Hi(e,i,1),this.R.Hi(e,i,1)]}Xl(t){const e=this.R.context,{base:i,targetFramebuffer:s,backgroundColor:r,layers:h,canvasWidth:a,canvasHeight:l}=t,u=e.isEnabled(e.DEPTH_TEST),c=e.getParameter(e.DEPTH_WRITEMASK);u&&e.disable(e.DEPTH_TEST),c&&e.depthMask(!1);const f=this.dl[0];f.begin(),this.R.xe(...r),f.end(),this.Ql=0,i.layer.sl&&this.Yl(i.texture,a,l,i.width,i.height,i.layer.qc,i.offsetX,i.offsetY,i.layer.nl,"normal");for(const g of h){const p=g.layer;p.sl&&this.Yl(g.texture,a,l,g.width,g.height,p.qc,g.offsetX,g.offsetY,p.nl,p.el)}this.Kl(s,a,l),e.depthMask(c),u&&e.enable(e.DEPTH_TEST)}Yl(t,e,i,s,r,h,a,l,u,c){const f=this.dl[this.Ql],g=this.Ql===0?1:0,p=this.dl[g],v=H(u);p.begin(),this.R.xi(this.jl),this.jl.gt({Uj:t,Uk:f.textures[0],Ul:[e,i],Um:[s,r],Un:[a,l],Uo:h,Up:v,Uq:se[c]}),this.R.Ei(0,0,f.width,f.height),p.end(),this.Ql=g}Kl(t,e,i){const s=this.dl[this.Ql];t.begin(),this.R.xi(this.jl),this.jl.gt({Uj:s.textures[0],Uk:s.textures[0],Ul:[e,i],Um:[s.width,s.height],Un:[0,0],Uo:1,Up:0,Uq:se.normal}),this.R.Ei(0,0,e,i),t.end()}vn(t,e){this.dl[0].resize(t,e),this.dl[1].resize(t,e)}Ss(){this.jl.dispose(),this.dl[0].dispose(),this.dl[1].dispose()}}class Je{constructor(t={}){o(this,"Wl",[]);o(this,"Zl",[]);o(this,"ql",!1);o(this,"l");this.l=t}async initialize(t){var e,i;for(const s of this.Zl)t&&await t(s),this.Wl.push(s),(i=(e=this.l).onAdd)==null||i.call(e,s);this.Zl=[],this.ql=!0}get isReady(){return this.ql}add(t){var e,i;return this.ql?(this.Wl.push(t),(i=(e=this.l).onAdd)==null||i.call(e,t)):this.Zl.push(t),t}addMany(t){for(const e of t)this.add(e);return t}remove(t){const e=this.Wl.indexOf(t);if(e!==-1)return this.Wl.splice(e,1),this.Vl(t),!0;const i=this.Zl.indexOf(t);return i!==-1&&(this.Zl.splice(i,1),this.Vl(t),!0)}removeAt(t){if(t<0||t>=this.Wl.length)return;const[e]=this.Wl.splice(t,1);return this.Vl(e),e}move(t,e){var r,h;const i=this.Wl.indexOf(t);if(i!==-1){this.Wl.splice(i,1);const a=U(e,0,this.Wl.length);return this.Wl.splice(a,0,t),(h=(r=this.l).onMove)==null||h.call(r,t,i,a),!0}const s=this.Zl.indexOf(t);if(s!==-1){this.Zl.splice(s,1);const a=U(e,0,this.Zl.length);return this.Zl.splice(a,0,t),!0}return!1}swap(t,e){var a,l;if(t===e)return!0;const i=this.Wl.indexOf(t),s=this.Wl.indexOf(e);if(i!==-1&&s!==-1)return this.Wl[i]=e,this.Wl[s]=t,(l=(a=this.l).onSwap)==null||l.call(a,t,e,i,s),!0;const r=this.Zl.indexOf(t),h=this.Zl.indexOf(e);return r!==-1&&h!==-1&&(this.Zl[r]=e,this.Zl[h]=t,!0)}clear(){for(const t of this.Wl)this.Vl(t);this.Wl=[];for(const t of this.Zl)this.Vl(t);this.Zl=[]}dispose(){this.clear(),this.ql=!1}get all(){return this.Wl}get pending(){return this.Zl}get length(){return this.Wl.length}get totalLength(){return this.Wl.length+this.Zl.length}get isEmpty(){return this.Wl.length===0}get(t){return this.Wl[t]}get first(){return this.Wl[0]}get last(){return this.Wl[this.Wl.length-1]}indexOf(t){return this.Wl.indexOf(t)}has(t){return this.Wl.includes(t)||this.Zl.includes(t)}[Symbol.iterator](){return this.Wl[Symbol.iterator]()}Vl(t){var e,i,s,r;(i=(e=this.l).onRemove)==null||i.call(e,t),(r=(s=this.l).onDispose)==null||r.call(s,t)}}class ne{constructor(t){o(this,"R");o(this,"Jl",new Map);o(this,"tu",new Map);o(this,"Ke");o(this,"dl");o(this,"Sr",!1);this.R=t,this.Ke=t.Mi(q,Qt),this.su()}async register(t,e,i={}){const s=Object.entries(i),r=s.length>0?s[0][1][0]:null;let h;if(typeof e=="string"){const l=await ft(e);h=this.R.Mi(q,l),this.tu.set(t,h)}else h=e,this.tu.set(t,h);const a={id:t,createShader:()=>h,createUniforms:(l,u)=>{const c={u_resolution:[u.width,u.height]};for(const[f,[g,p]]of s){let v=p;if(l!=null){if(typeof l=="number"&&g===r)v=l;else if(typeof l=="object"&&g in l){const d=l[g];Xt(d)&&(v=d)}}c[f]=v}return c}};this.Jl.set(t,a)}unregister(t){const e=this.tu.get(t);return e&&(e.dispose(),this.tu.delete(t)),this.Jl.delete(t)}has(t){return this.Jl.has(t)}Er(t,e){this.Sr||(this.dl=[this.R.Hi(t,e,1,{depth:!1}),this.R.Hi(t,e,1,{depth:!1})],this.Sr=!0)}eu(t,e,i,s,r){this.dl[0].width===s&&this.dl[0].height===r||(this.dl[0].resize(s,r),this.dl[1].resize(s,r)),this.bl(t,e,i,s,r,this.dl)}bl(t,e,i,s,r,h){if(i.length===0)return void this.iu(t,e,s,r);this.iu(t,h[0],s,r);let a=0;for(let l=0;l<i.length;l++){const u=i[l],c=l===i.length-1,f=a===0?1:0,g=c?e:h[f];this.ru(u,h[a],g,s,r),c||(a=f)}}ru(t,e,i,s,r){const h=this.Jl.get(t.name);if(!h)return console.warn(`[textmode.js] Unknown filter: "${t.name}". Skipping.`),void this.iu(e.textures[0],i,s,r);const a=this.nu(t.name,h,s,r),l={renderer:this.R,gl:this.R.context,width:s,height:r};i.begin(),this.R.xi(a),a.gt({u_texture:e.textures[0]});const u=h.createUniforms(t.params,l);a.gt(u),this.R.Ei(0,0,s,r),i.end()}nu(t,e,i,s){let r=this.tu.get(t);if(!r&&e){const h={renderer:this.R,gl:this.R.context,width:i,height:s};r=e.createShader(h),this.tu.set(t,r)}return r}iu(t,e,i,s){e.begin(),this.R.xi(this.Ke),this.Ke.gt({u_texture:t,u_resolution:[i,s]}),this.R.Ei(0,0,i,s),e.end()}vn(t,e){this.dl&&(this.dl[0].resize(t,e),this.dl[1].resize(t,e))}Ss(){for(const t of this.tu.values())t.dispose();this.tu.clear(),this.Jl.clear(),this.Ke.dispose(),this.dl&&(this.dl[0].dispose(),this.dl[1].dispose()),this.Sr=!1}su(){this.register("invert",`#version 300 es
14
14
  precision highp float;uniform sampler2D u_texture;in vec2 v_uv;out vec4 fragColor;void main(){vec4 A=texture(u_texture,v_uv);fragColor=vec4(1.-A.rgb,A.a);}`,{}),this.register("grayscale",`#version 300 es
15
- precision highp float;uniform sampler2D u_texture;uniform float Um;in vec2 v_uv;out vec4 fragColor;void main(){vec4 A=texture(u_texture,v_uv);float B=dot(A.rgb,vec3(0.299,0.587,0.114));vec3 C=mix(A.rgb,vec3(B),Um);fragColor=vec4(C,A.a);}`,{Um:["amount",1]}),this.register("sepia",`#version 300 es
16
- precision highp float;uniform sampler2D u_texture;uniform float Um;in vec2 v_uv;out vec4 fragColor;void main(){vec4 A=texture(u_texture,v_uv);vec3 B;B.r=dot(A.rgb,vec3(0.393,0.769,0.189));B.g=dot(A.rgb,vec3(0.349,0.686,0.168));B.b=dot(A.rgb,vec3(0.272,0.534,0.131));vec3 C=mix(A.rgb,B,Um);fragColor=vec4(C,A.a);}`,{Um:["amount",1]}),this.register("threshold",`#version 300 es
17
- precision highp float;uniform sampler2D u_texture;uniform float Uq;in vec2 v_uv;out vec4 fragColor;void main(){vec4 A=texture(u_texture,v_uv);float B=dot(A.rgb,vec3(0.299,0.587,0.114));float C=step(Uq,B);fragColor=vec4(vec3(C),A.a);}`,{Uq:["threshold",.5]})}}const ti=Object.freeze(Object.defineProperty({__proto__:null,TextmodeFilterManager:ne},Symbol.toStringTag,{value:"Module"}));class he{constructor(t,e){o(this,"Oa");o(this,"R");o(this,"ru");o(this,"nu");o(this,"hu");o(this,"ou");o(this,"Wl",!1);o(this,"au",new Set);o(this,"cu",[]);o(this,"lu");o(this,"uu");this.Oa=t,this.R=t.R,this.nu=new ne(this.R),this.ru=new re(this.R,this.Oa.Xr.width,this.Oa.Xr.height),this.hu=new Je({onRemove:i=>this.Oa._l.ec(i),onDispose:i=>i==null?void 0:i.Ss()}),this.ou=new dt(this.R,{visible:!0,opacity:1,fontSize:e.fontSize,fontSource:e.fontSource})}async Er(){await this.fu(this.ou);const t=this.Oa.Xr;this.lu=this.R.Hi(t.width,t.height,1),this.uu=this.R.Hi(t.width,t.height,1),this.nu.Er(t.width,t.height),await this.hu.initialize(e=>this.fu(e)),this.Wl=!0}du(t,e){this.cu.push({name:t,params:e})}pu(){this.cu=[]}add(t={}){const e=new dt(this.R,t);return this.hu.isReady&&this.fu(e),this.hu.add(e),e}remove(t){this.hu.remove(t)}move(t,e){this.hu.move(t,e)}swap(t,e){this.hu.swap(t,e)}clear(){this.hu.clear()}vu(t){this.Oa._l.Ja(),this.ou.Ra(this.Oa,this.Oa.zl);const e=[...this.R.state.canvasBackgroundColor];this.hu.all.forEach(i=>i.Ra(this.Oa,this.Oa.zl)),this.gu(t,e)}mu(){this.vu(this.lu);let t=this.lu.textures[0];if(this.cu.length>0){const i=this.Oa.Xr;this.nu.tu(this.lu.textures[0],this.uu,this.cu,i.width,i.height),t=this.uu.textures[0],this.cu=[]}const e=this.Oa.Xr;this.R.xe(0,0,0,0),this.R.xi(this.Oa.Hl),this.Oa.Hl.gt({u_texture:t}),this.R.Ei(0,0,e.width,e.height),this.Oa._l.sc()}gu(t,e){const i=this.Oa.Xr,s=this.ou.grid,r=this.ou.texture;if(!r)return;const h={layer:this.ou,texture:r,width:s.width,height:s.height,offsetX:s.offsetX+this.ou.sl,offsetY:s.offsetY+this.ou.el},a=this.hu.all.filter(l=>!!l.grid&&!!l.texture).map(l=>{const u=l.grid;return{layer:l,texture:l.texture,width:u.width,height:u.height,offsetX:u.offsetX+l.sl,offsetY:u.offsetY+l.el}});this.ru.jl({base:h,layers:a,targetFramebuffer:t,backgroundColor:e,canvasWidth:i.width,canvasHeight:i.height})}vn(){var e,i,s;if(!this.Wl)return;const t=this.Oa.Xr;this.ou.vn(),this.hu.all.forEach(r=>r.vn()),this.ru.vn(t.width,t.height),(e=this.lu)==null||e.resize(t.width,t.height),(i=this.uu)==null||i.resize(t.width,t.height),(s=this.nu)==null||s.vn(t.width,t.height)}Ss(){var t,e;this.hu.dispose(),this.Oa._l.ec(this.ou),this.ou.Ss(),this.nu.Ss(),this.ru.Ss(),(t=this.lu)==null||t.dispose(),(e=this.uu)==null||e.dispose(),this.cu=[]}get all(){return this.hu.all}get base(){return this.ou}get filters(){return this.nu}get resultFramebuffer(){return this.uu}_u(){const t=this.hu.all;for(let e=t.length-1;e>=0;e--){const i=t[e];if(i.Jc&&i.grid)return i.grid}return this.ou.grid}yu(t){this.au.add(t)}wu(){for(const t of this.au)t()}async fu(t){var i;const e={renderer:this.R,canvas:this.Oa.Xr,filterManager:this.nu,createFramebuffer:(s,r,h=1,a)=>this.R.Hi(s,r,h,a)};await t.vl(e),(i=t.grid)==null||i.Vr(()=>this.wu())}}const ei={id:"brightness",createShader:({gl:n})=>new k(n,ht,`#version 300 es
18
- precision highp float;in vec2 v_uv;uniform sampler2D u_image;uniform bool u_invert;uniform bool u_flipX;uniform bool u_flipY;uniform float u_charRotation;uniform bool u_charColorFixed;uniform vec4 u_charColor;uniform bool u_cellColorFixed;uniform vec4 u_cellColor;uniform vec4 u_backgroundColor;uniform int u_charCount;uniform vec3 u_charList[255];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 A;float B(vec3 C){return dot(C,vec3(0.299f,0.587f,0.114f));}void main(){vec2 D=vec2(v_uv.x,1.0f-v_uv.y);vec4 E=texture(u_image,D);float F=B(E.rgb);vec2 G=vec2(0.);if(u_charCount>0){float H=float(u_charCount);float I=clamp(F*(H-1.0f),0.0f,H-1.0f);int J=int(floor(I+0.5f));vec3 K=u_charList[J];G=K.xy;}else{G=vec2(0.0f,0.0f);}vec4 L=u_charColorFixed?u_charColor:E;vec4 M=u_cellColorFixed?u_cellColor:E;if(E.a<0.01f){discard;}o_primaryColor=vec4(L.rgb,L.a);o_secondaryColor=vec4(M.rgb,M.a);A=vec4(0.);int N=int(u_invert?1:0);int O=int(u_flipX?1:0);int P=int(u_flipY?1:0);float Q=float(N|(O<<1)|(P<<2))/255.;o_character=vec4(G,Q,clamp(u_charRotation,0.0f,1.0f));}`),createUniforms:({source:n})=>n.createBaseConversionUniforms()};class oe{constructor(){o(this,"Au",new Map);o(this,"Vl",new Map);this.bu()}register(t){this.Au.set(t.id,t)}unregister(t){const e=this.Vl.get(t);return e&&(e.dispose(),this.Vl.delete(t)),this.Au.delete(t)}has(t){return this.Au.has(t)}Nn(t){return this.Au.get(t)}Gn(t,e){let i=this.Vl.get(t);if(!i){const s=this.Au.get(t);if(!s)throw new Error(`[textmode.js] Conversion mode "${t}" is not registered.`);i=s.createShader(e),this.Vl.set(t,i)}return i}Ss(){for(const t of this.Vl.values())t.dispose();this.Vl.clear(),this.Au.clear()}bu(){this.register(ei)}}const ii=Object.freeze(Object.defineProperty({__proto__:null,TextmodeConversionManager:oe},Symbol.toStringTag,{value:"Module"}));class ae extends function(e,...i){return i.reduce((s,r)=>r(s),e)}(class{},Ve,je,We,Ke,Qe){constructor(e={}){super();o(this,"R");o(this,"zl");o(this,"Hl");o(this,"Xr");o(this,"ka");o(this,"bo");o(this,"Da");o(this,"La");o(this,"Cu");o(this,"xu");o(this,"yl");o(this,"Un");o(this,"Mu",new Set);o(this,"_l");o(this,"Fu",!1);o(this,"$u",!1);o(this,"Pu",!1);o(this,"Tu",!1);o(this,"Su",()=>{});o(this,"Eu",()=>{});o(this,"ku");o(this,"Ru");o(this,"Du");o(this,"rn",!1);o(this,"Lu");o(this,"Ou");this._l=new Kt(this),this.rn=e.overlay??!1,this.Xr=new kt(e),this.R=new Me(this.Xr.gn()),this.zl=this.R.Mi($,`#version 300 es
19
- precision highp float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D U0;uniform sampler2D U1;uniform sampler2D U2;uniform vec2 U3;uniform vec2 U4;uniform vec4 U5;in vec2 v_uv;out vec4 fragColor;mat2 A(float B){float C=sin(B);float D=cos(B);return mat2(D,-C,C,D);}void main(){vec2 E=gl_FragCoord.xy/U4;vec2 F=E*U3;vec2 G=floor(F);vec2 H=(G+0.5)/U3;vec4 I=texture(U0,H);vec4 J=texture(U1,H);vec4 K=texture(U2,H);int L=int(K.b*255.+0.5);bool M=(L&1)!=0;bool N=(L&2)!=0;bool O=(L&4)!=0;int P=int(K.r*255.+0.5)+int(K.g*255.+0.5)*256;int Q=int(u_charsetDimensions.x);int R=P/Q;int S=P-(R*Q);float T=(u_charsetDimensions.y-1.)-float(R);vec2 U=1./u_charsetDimensions;vec2 V=vec2(float(S),T)*U;vec2 W=V+U;float X=-K.a*360.*0.017453292;vec2 Y=fract(F)-0.5f;vec2 Z=vec2(N?-1.:1.,O?-1.:1.);Y*=Z;Y=A(X)*Y+0.5;vec2 a=V+clamp(Y,0.,1.)*U;const float b=0.0001;if(any(lessThan(a,V-b))||any(greaterThan(a,W+b))){fragColor=M?I:J;return;}vec4 c=texture(u_characterTexture,a);if(M)c.rgb=mix(c.rgb,1.-c.rgb,float(M));vec4 d=mix(U5,J,J.a);fragColor=mix(d,I,c);}`),this.Hl=this.R.Mi($,Qt),this.ka=new Ht(e.frameRate??60),this.Cu=new ie(this,e.loadingScreen,this.Xr.pn()),this.Cu.Ll(()=>{this.ka.ph=0,this.Tu=!0}),this.xu=new he(this,e);const i=()=>this.zu();this.bo=new Vt(this.Xr,i),this.Da=new Wt(this.Xr,i,this.bo),this.La=new jt,this.Un=new oe,this._l.Ka(e.plugins??[]),this.Cu.ih(),this.Hu()}Ea(e){var i;this.Mu.add(e),(i=e.C)==null||i.call(e,()=>{this.Mu.delete(e)})}async Hu(){await this.xu.Er(),await this.Cu.Er();const e=this.xu.base.grid;this.xu.yu(()=>{this.bo.Wh(),this.Da.Wh()}),this.rn&&(this.Lu=Q.jn(this.R,this.Un,this.Xr.targetCanvas,e.cols,e.rows)),this.Bu(),this.ka.ih(()=>this.Ra());try{await this._l.hc(),await this.Su(),await this._l.ac(),this.Cu.Bc()}catch(i){console.error("Error during setup:",i),this.Cu.error(i)}}Bu(){this.ku=()=>{this.rn&&this.resizeCanvas(this.Xr.targetCanvas.width,this.Xr.targetCanvas.height),this.Eu()},window.addEventListener("resize",this.ku),this.bo.Ih(),this.Da.Ih(),this.La.Ih(),this.Ru=()=>{this.La.Ao()},window.addEventListener("blur",this.Ru),this.rn&&(this.Du=new ResizeObserver(()=>{this.resizeCanvas(this.Xr.targetCanvas.width,this.Xr.targetCanvas.height)}),this.Du.observe(this.Xr.targetCanvas))}Ra(){if(!this.Cu.Lc&&this.Tu){this.$u=!0;try{this.ka.ah(),this.ka.gh(),this.rn&&et(this.R.context,this.Lu.texture,this.Xr.targetCanvas),this.xu.mu()}finally{this.$u=!1,this.Fu&&!this.Pu&&this.Iu()}}}resizeCanvas(e,i){var s;this.Xr.vn(e,i),this.Cu.Bl(this.Xr.pn()),this.Cu.vn(),(s=this.xu)==null||s.vn(),this.R.Gi(),this.Ra()}destroy(){this.Pu||this.Fu||(this.Fu=!0,this.ka.nh(),this.$u||this.Iu())}Iu(){var e,i,s,r;this.Fu=!1,this.Xr.Ss(),this.Cu.Ss(),this._l.cc(),window.removeEventListener("resize",this.ku),window.removeEventListener("blur",this.Ru),(e=this.Du)==null||e.disconnect(),this.bo.Kh(),this.Da.Kh(),this.La.Kh(),(i=this.xu)==null||i.Ss(),(s=this.Un)==null||s.Ss();for(const h of this.Mu)h.dispose();this.Mu.clear(),this.zl.dispose(),this.Hl.dispose(),this.R.Ss(),(r=this.Lu)==null||r.dispose(),this.Pu=!0}filter(e,i){this.xu.du(e,i)}draw(e){this.xu.base.draw(e)}async loadFont(e,i=!0){if(i)return await this.xu.base.loadFont(e),this.xu.base.font;if(e instanceof V)return e.Gr||await e.Er(),e;const s=new V(this.R);return await s.Er(e),this.Ea(s),s}fontSize(e){return this.xu.base.fontSize(e)}inputGrid(e){return e===void 0?this.Ou??"topmost":e==="topmost"?(this.Ou=void 0,this.bo.Wh(),void this.Da.Wh()):(this.Ou=e,this.bo.Wh(),void this.Da.Wh())}zu(){return this.Ou?this.Ou:this.xu._u()}async setup(e){this.Su=e}windowResized(e){this.Eu=e}get grid(){var e;return((e=this.yl)==null?void 0:e.grid)??this.xu.base.grid}get font(){var e;return((e=this.yl)==null?void 0:e.font)??this.xu.base.font}get width(){return this.Xr.width}get height(){return this.Xr.height}get canvas(){return this.Xr.canvas}get isDisposed(){return this.Pu}get overlay(){return this.Lu}get loading(){return this.Cu}get layers(){return this.xu}get filters(){return this.xu.filters}get conversions(){return this.Un}get isRenderingFrame(){return this.$u}}class gt{constructor(){}static create(t={}){return new ae(t)}static setErrorLevel(t){vt._(t)}static get version(){return"0.9.0"}}const si=Object.freeze(Object.defineProperty({__proto__:null,LoadingPhase:ee,LoadingPhaseTracker:Zt,LoadingScreenManager:ie,LoadingScreenStateMachine:$t,LoadingScreenTransition:qt,resolveColorInputs:te,resolveDefaultPalette:Jt,resolveTheme:Rt},Symbol.toStringTag,{value:"Module"})),ri=Object.freeze(Object.defineProperty({__proto__:null,TextmodeFont:V,TextmodeImage:Q,TextmodeSource:Tt,TextmodeTexture:Z,TextmodeVideo:ut},Symbol.toStringTag,{value:"Module"})),ni=Object.freeze(Object.defineProperty({__proto__:null,keyboard:He,mouse:ke,touch:Ge},Symbol.toStringTag,{value:"Module"})),hi=Object.freeze(Object.defineProperty({__proto__:null,LayerCompositor:re,TextmodeLayer:dt,TextmodeLayerManager:he},Symbol.toStringTag,{value:"Module"})),oi=gt.create,ai=gt.setErrorLevel,li=gt.version;E.TextmodeCanvas=kt,E.TextmodeColor=x,E.TextmodeError=T,E.TextmodeErrorLevel=N,E.TextmodeFramebuffer=it,E.TextmodeGrid=Bt,E.TextmodeShader=k,E.Textmodifier=ae,E.conversion=ii,E.create=oi,E.filters=ti,E.input=ni,E.layering=hi,E.loadables=ri,E.loading=si,E.plugins=Ze,E.setErrorLevel=ai,E.textmode=gt,E.version=li,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"})});
15
+ precision highp float;uniform sampler2D u_texture;uniform float U6;in vec2 v_uv;out vec4 fragColor;void main(){vec4 A=texture(u_texture,v_uv);float B=dot(A.rgb,vec3(0.299,0.587,0.114));vec3 C=mix(A.rgb,vec3(B),U6);fragColor=vec4(C,A.a);}`,{U6:["amount",1]}),this.register("sepia",`#version 300 es
16
+ precision highp float;uniform sampler2D u_texture;uniform float U6;in vec2 v_uv;out vec4 fragColor;void main(){vec4 A=texture(u_texture,v_uv);vec3 B;B.r=dot(A.rgb,vec3(0.393,0.769,0.189));B.g=dot(A.rgb,vec3(0.349,0.686,0.168));B.b=dot(A.rgb,vec3(0.272,0.534,0.131));vec3 C=mix(A.rgb,B,U6);fragColor=vec4(C,A.a);}`,{U6:["amount",1]}),this.register("threshold",`#version 300 es
17
+ precision highp float;uniform sampler2D u_texture;uniform float Ua;in vec2 v_uv;out vec4 fragColor;void main(){vec4 A=texture(u_texture,v_uv);float B=dot(A.rgb,vec3(0.299,0.587,0.114));float C=step(Ua,B);fragColor=vec4(vec3(C),A.a);}`,{Ua:["threshold",.5]})}}const ti=Object.freeze(Object.defineProperty({__proto__:null,TextmodeFilterManager:ne},Symbol.toStringTag,{value:"Module"}));class he{constructor(t,e){o(this,"Ha");o(this,"R");o(this,"hu");o(this,"ou");o(this,"au");o(this,"cu");o(this,"ql",!1);o(this,"lu",new Set);o(this,"uu",[]);o(this,"fu");o(this,"du");this.Ha=t,this.R=t.R,this.ou=new ne(this.R),this.hu=new re(this.R,this.Ha.Xr.width,this.Ha.Xr.height),this.au=new Je({onRemove:i=>this.Ha.wl.nc(i),onDispose:i=>i==null?void 0:i.Ss()}),this.cu=new dt(this.R,{visible:!0,opacity:1,fontSize:e.fontSize,fontSource:e.fontSource})}async Er(){await this.pu(this.cu);const t=this.Ha.Xr;this.fu=this.R.Hi(t.width,t.height,1),this.du=this.R.Hi(t.width,t.height,1),this.ou.Er(t.width,t.height),await this.au.initialize(e=>this.pu(e)),this.ql=!0}vu(t,e){this.uu.push({name:t,params:e})}gu(){this.uu=[]}add(t={}){const e=new dt(this.R,t);return this.au.isReady&&this.pu(e),this.au.add(e),e}remove(t){this.au.remove(t)}move(t,e){this.au.move(t,e)}swap(t,e){this.au.swap(t,e)}clear(){this.au.clear()}mu(t){this.Ha.wl.sc(),this.cu.La(this.Ha,this.Ha.Bl);const e=[...this.R.state.canvasBackgroundColor];this.au.all.forEach(i=>i.La(this.Ha,this.Ha.Bl)),this._u(t,e)}yu(){this.mu(this.fu);let t=this.fu.textures[0];if(this.uu.length>0){const i=this.Ha.Xr;this.ou.eu(this.fu.textures[0],this.du,this.uu,i.width,i.height),t=this.du.textures[0],this.uu=[]}const e=this.Ha.Xr;this.R.xe(0,0,0,0),this.R.xi(this.Ha.Il),this.Ha.Il.gt({u_texture:t}),this.R.Ei(0,0,e.width,e.height),this.Ha.wl.rc()}_u(t,e){const i=this.Ha.Xr,s=this.cu.grid,r=this.cu.texture;if(!r)return;const h={layer:this.cu,texture:r,width:s.width,height:s.height,offsetX:s.offsetX+this.cu.il,offsetY:s.offsetY+this.cu.rl},a=this.au.all.filter(l=>!!l.grid&&!!l.texture).map(l=>{const u=l.grid;return{layer:l,texture:l.texture,width:u.width,height:u.height,offsetX:u.offsetX+l.il,offsetY:u.offsetY+l.rl}});this.hu.Xl({base:h,layers:a,targetFramebuffer:t,backgroundColor:e,canvasWidth:i.width,canvasHeight:i.height})}vn(){var e,i,s;if(!this.ql)return;const t=this.Ha.Xr;this.cu.vn(),this.au.all.forEach(r=>r.vn()),this.hu.vn(t.width,t.height),(e=this.fu)==null||e.resize(t.width,t.height),(i=this.du)==null||i.resize(t.width,t.height),(s=this.ou)==null||s.vn(t.width,t.height)}Ss(){var t,e;this.au.dispose(),this.Ha.wl.nc(this.cu),this.cu.Ss(),this.ou.Ss(),this.hu.Ss(),(t=this.fu)==null||t.dispose(),(e=this.du)==null||e.dispose(),this.uu=[]}get all(){return this.au.all}get base(){return this.cu}get filters(){return this.ou}get resultFramebuffer(){return this.du}wu(){const t=this.au.all;for(let e=t.length-1;e>=0;e--){const i=t[e];if(i.sl&&i.grid)return i.grid}return this.cu.grid}Au(t){this.lu.add(t)}bu(){for(const t of this.lu)t()}async pu(t){var i;const e={renderer:this.R,canvas:this.Ha.Xr,filterManager:this.ou,createFramebuffer:(s,r,h=1,a)=>this.R.Hi(s,r,h,a)};await t._l(e),(i=t.grid)==null||i.Vr(()=>this.bu())}}const ei={id:"brightness",createShader:({gl:n})=>new z(n,ht,`#version 300 es
18
+ precision highp float;in vec2 v_uv;uniform sampler2D u_image;uniform bool u_invert;uniform bool u_flipX;uniform bool u_flipY;uniform float u_charRotation;uniform bool u_charColorFixed;uniform vec4 u_charColor;uniform bool u_cellColorFixed;uniform vec4 u_cellColor;uniform vec4 u_backgroundColor;uniform int u_charCount;uniform vec3 u_charList[255];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 A;float B(vec3 C){return dot(C,vec3(0.299f,0.587f,0.114f));}void main(){vec2 D=vec2(v_uv.x,1.0f-v_uv.y);vec4 E=texture(u_image,D);float F=B(E.rgb);vec2 G=vec2(0.);if(u_charCount>0){float H=float(u_charCount);float I=clamp(F*(H-1.0f),0.0f,H-1.0f);int J=int(floor(I+0.5f));vec3 K=u_charList[J];G=K.xy;}else{G=vec2(0.0f,0.0f);}vec4 L=u_charColorFixed?u_charColor:E;vec4 M=u_cellColorFixed?u_cellColor:E;if(E.a<0.01f){discard;}o_primaryColor=vec4(L.rgb,L.a);o_secondaryColor=vec4(M.rgb,M.a);A=vec4(0.);int N=int(u_invert?1:0);int O=int(u_flipX?1:0);int P=int(u_flipY?1:0);float Q=float(N|(O<<1)|(P<<2))/255.;o_character=vec4(G,Q,clamp(u_charRotation,0.0f,1.0f));}`),createUniforms:({source:n})=>n.createBaseConversionUniforms()};class oe{constructor(){o(this,"Cu",new Map);o(this,"tu",new Map);this.xu()}register(t){this.Cu.set(t.id,t)}unregister(t){const e=this.tu.get(t);return e&&(e.dispose(),this.tu.delete(t)),this.Cu.delete(t)}has(t){return this.Cu.has(t)}jn(t){return this.Cu.get(t)}Nn(t,e){let i=this.tu.get(t);if(!i){const s=this.Cu.get(t);if(!s)throw new Error(`[textmode.js] Conversion mode "${t}" is not registered.`);i=s.createShader(e),this.tu.set(t,i)}return i}Ss(){for(const t of this.tu.values())t.dispose();this.tu.clear(),this.Cu.clear()}xu(){this.register(ei)}}const ii=Object.freeze(Object.defineProperty({__proto__:null,TextmodeConversionManager:oe},Symbol.toStringTag,{value:"Module"}));class ae extends function(e,...i){return i.reduce((s,r)=>r(s),e)}(class{},We,je,Ve,Ze,Qe){constructor(e={}){super();o(this,"R");o(this,"Bl");o(this,"Il");o(this,"Xr");o(this,"Da");o(this,"Co");o(this,"Oa");o(this,"za");o(this,"Mu");o(this,"Fu");o(this,"Al");o(this,"En");o(this,"$u",new Set);o(this,"wl");o(this,"Pu",!1);o(this,"Tu",!1);o(this,"Su",!1);o(this,"Eu",!1);o(this,"ku",()=>{});o(this,"Ru",()=>{});o(this,"Du");o(this,"Lu");o(this,"Ou");o(this,"rn",!1);o(this,"zu");o(this,"Hu");this.wl=new Zt(this),this.rn=e.overlay??!1,this.Xr=new zt(e),this.R=new Me(this.Xr.gn()),this.Bl=this.R.Mi(q,`#version 300 es
19
+ precision highp float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D U0;uniform sampler2D U1;uniform sampler2D U2;uniform vec2 U3;uniform vec2 U4;uniform vec4 U5;in vec2 v_uv;out vec4 fragColor;mat2 A(float B){float C=sin(B);float D=cos(B);return mat2(D,-C,C,D);}void main(){vec2 E=gl_FragCoord.xy/U4;vec2 F=E*U3;vec2 G=floor(F);vec2 H=(G+0.5)/U3;vec4 I=texture(U0,H);vec4 J=texture(U1,H);vec4 K=texture(U2,H);int L=int(K.b*255.+0.5);bool M=(L&1)!=0;bool N=(L&2)!=0;bool O=(L&4)!=0;int P=int(K.r*255.+0.5)+int(K.g*255.+0.5)*256;int Q=int(u_charsetDimensions.x);int R=P/Q;int S=P-(R*Q);float T=(u_charsetDimensions.y-1.)-float(R);vec2 U=1./u_charsetDimensions;vec2 V=vec2(float(S),T)*U;vec2 W=V+U;float X=-K.a*360.*0.017453292;vec2 Y=fract(F)-0.5f;vec2 Z=vec2(N?-1.:1.,O?-1.:1.);Y*=Z;Y=A(X)*Y+0.5;vec2 a=V+clamp(Y,0.,1.)*U;const float b=0.0001;if(any(lessThan(a,V-b))||any(greaterThan(a,W+b))){fragColor=M?I:J;return;}vec4 c=texture(u_characterTexture,a);if(M)c.rgb=mix(c.rgb,1.-c.rgb,float(M));vec4 d=mix(U5,J,J.a);fragColor=mix(d,I,c);}`),this.Il=this.R.Mi(q,Qt),this.Da=new kt(e.frameRate??60),this.Mu=new ie(this,e.loadingScreen,this.Xr.pn()),this.Mu.zl(()=>{this.Da.gh=0,this.Eu=!0}),this.Fu=new he(this,e);const i=()=>this.Bu();this.Co=new Wt(this.Xr,i),this.Oa=new Vt(this.Xr,i,this.Co),this.za=new jt,this.En=new oe,this.wl.Za(e.plugins??[]),this.Mu.rh(),this.Iu()}Ra(e){var i;this.$u.add(e),(i=e.C)==null||i.call(e,()=>{this.$u.delete(e)})}async Iu(){await this.Fu.Er(),await this.Mu.Er();const e=this.Fu.base.grid;this.Fu.Au(()=>{this.Co.Zh(),this.Oa.Zh()}),this.rn&&(this.zu=Q.Qn(this.R,this.En,this.Xr.targetCanvas,e.cols,e.rows)),this.Gu(),this.Da.rh(()=>this.La());try{await this.wl.ac(),await this.ku(),await this.wl.lc(),this.Mu.Gc()}catch(i){console.error("Error during setup:",i),this.Mu.error(i)}}Gu(){this.Du=()=>{this.rn&&this.resizeCanvas(this.Xr.targetCanvas.width,this.Xr.targetCanvas.height),this.Ru()},window.addEventListener("resize",this.Du),this.Co.Gh(),this.Oa.Gh(),this.za.Gh(),this.Lu=()=>{this.za.bo()},window.addEventListener("blur",this.Lu),this.rn&&(this.Ou=new ResizeObserver(()=>{this.resizeCanvas(this.Xr.targetCanvas.width,this.Xr.targetCanvas.height)}),this.Ou.observe(this.Xr.targetCanvas))}La(){if(!this.Mu.zc&&this.Eu){this.Tu=!0;try{this.Da.uh(),this.Da.mh(),this.rn&&et(this.R.context,this.zu.texture,this.Xr.targetCanvas),this.Fu.yu()}finally{this.Tu=!1,this.Pu&&!this.Su&&this.Nu()}}}resizeCanvas(e,i){var s;this.Xr.vn(e,i),this.Mu.Gl(this.Xr.pn()),this.Mu.vn(),(s=this.Fu)==null||s.vn(),this.R.Gi(),this.La()}destroy(){this.Su||this.Pu||(this.Pu=!0,this.Da.hh(),this.Tu||this.Nu())}Nu(){var e,i,s,r;this.Pu=!1,this.Xr.Ss(),this.Mu.Ss(),this.wl.uc(),window.removeEventListener("resize",this.Du),window.removeEventListener("blur",this.Lu),(e=this.Ou)==null||e.disconnect(),this.Co.Wh(),this.Oa.Wh(),this.za.Wh(),(i=this.Fu)==null||i.Ss(),(s=this.En)==null||s.Ss();for(const h of this.$u)h.dispose();this.$u.clear(),this.Bl.dispose(),this.Il.dispose(),this.R.Ss(),(r=this.zu)==null||r.dispose(),this.Su=!0}filter(e,i){this.Fu.vu(e,i)}draw(e){this.Fu.base.draw(e)}async loadFont(e,i=!0){if(i)return await this.Fu.base.loadFont(e),this.Fu.base.font;if(e instanceof W)return e.Gr||await e.Er(),e;const s=new W(this.R);return await s.Er(e),this.Ra(s),s}fontSize(e){return this.Fu.base.fontSize(e)}inputGrid(e){return e===void 0?this.Hu??"topmost":e==="topmost"?(this.Hu=void 0,this.Co.Zh(),void this.Oa.Zh()):(this.Hu=e,this.Co.Zh(),void this.Oa.Zh())}Bu(){return this.Hu?this.Hu:this.Fu.wu()}async setup(e){this.ku=e}windowResized(e){this.Ru=e}get grid(){var e;return((e=this.Al)==null?void 0:e.grid)??this.Fu.base.grid}get font(){var e;return((e=this.Al)==null?void 0:e.font)??this.Fu.base.font}get width(){return this.Xr.width}get height(){return this.Xr.height}get canvas(){return this.Xr.canvas}get isDisposed(){return this.Su}get overlay(){return this.zu}get loading(){return this.Mu}get layers(){return this.Fu}get filters(){return this.Fu.filters}get conversions(){return this.En}get isRenderingFrame(){return this.Tu}}class gt{constructor(){}static create(t={}){return new ae(t)}static setErrorLevel(t){mt._(t)}static get version(){return"0.9.1"}}const si=Object.freeze(Object.defineProperty({__proto__:null,LoadingPhase:ee,LoadingPhaseTracker:$t,LoadingScreenManager:ie,LoadingScreenStateMachine:qt,LoadingScreenTransition:Kt,resolveColorInputs:te,resolveDefaultPalette:Jt,resolveTheme:Tt},Symbol.toStringTag,{value:"Module"})),ri=Object.freeze(Object.defineProperty({__proto__:null,TextmodeFont:W,TextmodeImage:Q,TextmodeSource:Rt,TextmodeTexture:$,TextmodeVideo:ut},Symbol.toStringTag,{value:"Module"})),ni=Object.freeze(Object.defineProperty({__proto__:null,keyboard:ke,mouse:ze,touch:Ge},Symbol.toStringTag,{value:"Module"})),hi=Object.freeze(Object.defineProperty({__proto__:null,LayerCompositor:re,TextmodeLayer:dt,TextmodeLayerManager:he},Symbol.toStringTag,{value:"Module"})),oi=gt.create,ai=gt.setErrorLevel,li=gt.version;E.TextmodeCanvas=zt,E.TextmodeColor=x,E.TextmodeError=R,E.TextmodeErrorLevel=_,E.TextmodeFramebuffer=it,E.TextmodeGrid=Ht,E.TextmodeShader=z,E.Textmodifier=ae,E.conversion=ii,E.create=oi,E.filters=ti,E.input=ni,E.layering=hi,E.loadables=ri,E.loading=si,E.plugins=$e,E.setErrorLevel=ai,E.textmode=gt,E.version=li,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"})});