textmode.js 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ (function(h,C){typeof exports=="object"&&typeof module<"u"?C(exports):typeof define=="function"&&define.amd?define(["exports"],C):(h=typeof globalThis<"u"?globalThis:h||self,C((h.textmode=h.textmode||{},h.textmode.js={})))})(this,function(h){"use strict";var N=Object.defineProperty;var J=(h,C,l)=>C in h?N(h,C,{enumerable:!0,configurable:!0,writable:!0,value:l}):h[C]=l;var E=(h,C,l)=>J(h,typeof C!="symbol"?C+"":C,l);class C{constructor(){E(this,"bin");this.bin=this.createBinaryReader()}parse(A){const e=new Uint8Array(A);let B=0;if(this.bin.readASCII(e,B,4)==="ttcf"){const r=this.bin.readUint(e,B+8);B+=12;const Q=[];for(let g=0;g<r;g++){const i=this.bin.readUint(e,B);B+=4,Q.push(this.readFont(e,g,i))}return Q}else return[this.readFont(e,0,0)]}findTable(A,e,B){const t=this.bin.readUshort(A,B+4);let r=B+12;for(let Q=0;Q<t;Q++){const g=this.bin.readASCII(A,r,4),i=this.bin.readUint(A,r+8),s=this.bin.readUint(A,r+12);if(g===e)return[i,s];r+=16}return null}readFont(A,e,B){const t={_data:A,_index:e,_offset:B},r=new Map,Q=["cmap","head","hhea","maxp","hmtx"];for(const g of Q){const i=this.findTable(A,g,B);if(i){const[s,n]=i;let o=r.get(s);o||(o=this.parseTable(g,A,s,n,t),r.set(s,o)),t[g]=o}}return t}parseTable(A,e,B,t,r){switch(A){case"cmap":return this.parseCmapTable(e,B,t);case"head":return this.parseHeadTable(e,B,t);case"hhea":return this.parseHheaTable(e,B,t);case"hmtx":return this.parseHmtxTable(e,B,t,r);case"maxp":return this.parseMaxpTable(e,B,t);default:throw new Error(`Unknown table: ${A}`)}}parseCmapTable(A,e,B){const t=new Uint8Array(A.buffer,e,B);let r=0;r+=2;const Q=this.bin.readUshort(t,r);r+=2;const g={tables:[],ids:{},off:e},i=new Set;for(let s=0;s<Q;s++){const n=this.bin.readUshort(t,r);r+=2;const o=this.bin.readUshort(t,r);r+=2;const a=this.bin.readUint(t,r);r+=4;const P=`p${n}e${o}`;if(!i.has(a)){const L=this.bin.readUshort(t,a),k=this.parseCmapSubtable(t,a,L);g.tables.push(k),i.add(a)}g.ids[P]=Array.from(i).indexOf(a)}return g}parseCmapSubtable(A,e,B){const t={format:B};switch(B){case 0:return this.parseCmapFormat0(A,e,t);case 4:return this.parseCmapFormat4(A,e,t);case 6:return this.parseCmapFormat6(A,e,t);case 12:return this.parseCmapFormat12(A,e,t);default:return t}}parseCmapFormat0(A,e,B){let t=e+2;const r=this.bin.readUshort(A,t);t+=2,t+=2,B.map=[];for(let Q=0;Q<r-6;Q++)B.map.push(A[t+Q]);return B}parseCmapFormat4(A,e,B){const t=e;let r=e+2;const Q=this.bin.readUshort(A,r);r+=2,r+=2;const g=this.bin.readUshort(A,r);r+=2;const i=g>>>1;B.searchRange=this.bin.readUshort(A,r),r+=2,B.entrySelector=this.bin.readUshort(A,r),r+=2,B.rangeShift=this.bin.readUshort(A,r),r+=2,B.endCount=this.bin.readUshorts(A,r,i),r+=i*2,r+=2,B.startCount=this.bin.readUshorts(A,r,i),r+=i*2,B.idDelta=[];for(let s=0;s<i;s++)B.idDelta.push(this.bin.readShort(A,r)),r+=2;return B.idRangeOffset=this.bin.readUshorts(A,r,i),r+=i*2,B.glyphIdArray=this.bin.readUshorts(A,r,t+Q-r>>1),B}parseCmapFormat6(A,e,B){let t=e+2;t+=2,t+=2,B.firstCode=this.bin.readUshort(A,t),t+=2;const r=this.bin.readUshort(A,t);t+=2,B.glyphIdArray=[];for(let Q=0;Q<r;Q++)B.glyphIdArray.push(this.bin.readUshort(A,t)),t+=2;return B}parseCmapFormat12(A,e,B){let t=e+4;t+=4,t+=4;const r=this.bin.readUint(A,t)*3;t+=4,B.groups=new Uint32Array(r);for(let Q=0;Q<r;Q+=3)B.groups[Q]=this.bin.readUint(A,t+(Q<<2)),B.groups[Q+1]=this.bin.readUint(A,t+(Q<<2)+4),B.groups[Q+2]=this.bin.readUint(A,t+(Q<<2)+8);return B}parseHeadTable(A,e,B){let t=e;return t+=4,{fontRevision:this.bin.readFixed(A,t+0),flags:this.bin.readUshort(A,t+8),unitsPerEm:this.bin.readUshort(A,t+10),created:this.bin.readUint64(A,t+12),modified:this.bin.readUint64(A,t+20),xMin:this.bin.readShort(A,t+28),yMin:this.bin.readShort(A,t+30),xMax:this.bin.readShort(A,t+32),yMax:this.bin.readShort(A,t+34),macStyle:this.bin.readUshort(A,t+36),lowestRecPPEM:this.bin.readUshort(A,t+38),fontDirectionHint:this.bin.readShort(A,t+40),indexToLocFormat:this.bin.readShort(A,t+42),glyphDataFormat:this.bin.readShort(A,t+44)}}parseHheaTable(A,e,B){let t=e;t+=4;const r=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],Q={};for(let g=0;g<r.length;g++){const i=r[g],n=i==="advanceWidthMax"||i==="numberOfHMetrics"?this.bin.readUshort:this.bin.readShort;Q[i]=n(A,t+g*2)}return Q}parseHmtxTable(A,e,B,t){const r=t.maxp.numGlyphs,Q=t.hhea.numberOfHMetrics,g=[],i=[];let s=e,n=0,o=0;for(let a=0;a<Q;a++)n=this.bin.readUshort(A,s),o=this.bin.readShort(A,s+2),g.push(n),i.push(o),s+=4;for(let a=Q;a<r;a++)g.push(n),i.push(o);return{aWidth:g,lsBearing:i}}parseMaxpTable(A,e,B){let t=e;t+=4;const r=this.bin.readUshort(A,t);return t+=2,{numGlyphs:r}}createBinaryReader(){const A=new ArrayBuffer(8),e={buff:A,int8:new Int8Array(A),uint8:new Uint8Array(A),int16:new Int16Array(A),uint16:new Uint16Array(A),int32:new Int32Array(A),uint32:new Uint32Array(A)};return{readFixed:(B,t)=>(B[t]<<8|B[t+1])+(B[t+2]<<8|B[t+3])/(256*256+4),readInt:(B,t)=>(e.uint8[0]=B[t+3],e.uint8[1]=B[t+2],e.uint8[2]=B[t+1],e.uint8[3]=B[t],e.int32[0]),readShort:(B,t)=>(e.uint16[0]=B[t]<<8|B[t+1],e.int16[0]),readUshort:(B,t)=>B[t]<<8|B[t+1],readUshorts:(B,t,r)=>{const Q=new Array(r);for(let g=0;g<r;g++)Q[g]=B[t+g*2]<<8|B[t+g*2+1];return Q},readUint:(B,t)=>(e.uint8[3]=B[t],e.uint8[2]=B[t+1],e.uint8[1]=B[t+2],e.uint8[0]=B[t+3],e.uint32[0]),readUint64:(B,t)=>{const r=e.uint32[0]=B[t]<<24|B[t+1]<<16|B[t+2]<<8|B[t+3],Q=e.uint32[0]=B[t+4]<<24|B[t+5]<<16|B[t+6]<<8|B[t+7];return r*4294967296+Q},readASCII:(B,t,r)=>{let Q="";for(let g=0;g<r;g++)Q+=String.fromCharCode(B[t+g]);return Q},t:e}}}const l=new C,p={parse:D=>l.parse(D),findTable:(D,A,e)=>l.findTable(D,A,e)},F=`data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAA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AIAAAACA/YAAgAAAAIAAAP8AAoABAAAA/4AAAP+A/4AAgAAAAIAAAP8AA4AAAP8AAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAP+AAAD/gAAAAAAAAP8AAAAAgAAAAAAAAP+AAAD/gAAAAAAAAwCAAIAEAAQAABcAHQAjAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAACAAAAAgAAA/4AAAACAAAD9AAAA/4AAAACAAAD/gAAAAIAAgAAAAIAAAACAAAD/AAAAAQAAAP+AAAAEAAAA/4AAAP8AAAD/gAAAAIAAAP8AAAD/gAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAP+AAAD/gAAAAQD+gP8AAAAAgAAAAIAAAAABAYACgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAP6AAAAAAAABAQAAgAMABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/oAAAP+AAAD/gAAAAIAAAACAAAABgAAAAIAAAAAAAAEBAACAAwAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAAAgAAAAIAAAAGAAAAAgAAAAAAABQCAAYADgAQAAAMABwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAIAAAP+AAYAAgAAA/4D/AAEAAAABAAAA/wAAAP8AAAD/AAAAAQD/gACAAAD/gAGAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP+AAAAAAAABAQAAgAOAAwAACwAAAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAD/gAAA/wAAAAEAAwAAAP8AAAD/gAAA/wAAAAEAAAAAgAAAAAAAAQCAAAACAAGAAAcAAAEBAQEBAQEBAQABAAAA/4AAAP8AAAAAgAGAAAD/AAAA/4AAAACAAAAAAAABAIABgAOAAgAAAwAAAQEBAQCAAwAAAP0AAgAAAP+AAAAAAAABAQAAgAIAAYAAAwAAAQEBAQEAAQAAAP8AAYAAAP8AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAwCAAIADgAQAAAsAEQAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAD/gAAAAIAAgAAAAIAAAACAAAD/gAAA/4AAAAEAAAAEAAAA/4AAAP2AAAD/gAAAAIAAAAKAAAAAAP8AAAAAgAAAAID/AP+AAAD/AAAAAYAAAAABAIAAgAOABAAADQAAAQEBAQEBAQEBAQEBAQEBgAEAAAABAAAA/QAAAAEAAAD/AAAAAIAAAACABAAAAP0AAAD/gAAAAIAAAAGAAAAAgAAAAIAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAAAIAAAACAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAA/wAAAAEAAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/wAAAAEAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAA/4AAAACAAAAAAAABAIAAgAOABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAP+AAAABAAAAAQAAAP8AAAD+AAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAAEAAAD9gAAAAQAAAAGAAAAAgAAAAAEAgACAA4AEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP4AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/gAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAP+AAAABAAAAAAAAAgCAAIADgAQAABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAYAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAoAAAP6A/wAAAAEAAAEAgACAA4AEAAAPAAABAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AEAAAA/oAAAP+AAAD+gAAAAYAAAACAAAABAAAA/4AAAAAAAAMAgACAA4AEAAATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAACAAAD/gAAAAIAAgAAAAQAAAP8AAAABAAAABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAA/wAAAAEA/oD/AAAAAQAAAAACAIAAgAOABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD+gAAA/4AAAACAAIAAAAEAAAAEAAAA/4AAAP0AAAABAAAAAIAAAAGAAAAAAP6AAAABgAACAQABAAIAA4AAAwAHAAABAQEBAQEBAQEAAQAAAP8AAAABAAAA/wADgAAA/wAAAP+AAAD/AAAAAAIAgACAAgADgAADAAsAAAEBAQEBAQEBAQEBAQEAAQAAAP8AAAABAAAA/4AAAP8AAAAAgAOAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAABAQAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQKAAQAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAACAIABgAOAAwAAAwAHAAABAQEBAQEBAQCAAwAAAP0AAAADAAAA/QADAAAA/4AAAP+AAAD/gAAAAAEAgACAAwAEAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAIAgACAA4AEAAATABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP8AAAD/AAAAAIAAgAEAAAD/AAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAA/4AAAACAAAD+AAAA/wAAAAACAIAAgAOABAAAEQAVAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP6AAAAAgAAA/wAAAAGAAAD+AAAA/4AAAACAAgAAgAAA/4AEAAAA/4AAAP6AAAABAAAAAIAAAP2AAAD/gAAAAIAAAAKAAAD+AAAA/4AAAAAAAAIAgACAA4AEAAAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAAAIAAAACAAAD/AAAA/wAAAP8AAAAAgAAAAIAAAAAAAQAAAAQAAAD/gAAA/4AAAP2AAAABAAAA/wAAAAKAAAAAgAAA/4D/AAAAAQAAAwCAAIADgAQAAAsADwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAAAIAAAP+AAAD9gAEAAAABAAAA/wAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAADAP8AAAABAP6A/wAAAAEAAAAAAQCAAIADgAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAQAAAAEAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAACAIAAgAOABAAACwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAEAAAAAgAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAADAP2AAAAAgAAAAYAAAACAAAEAgACAA4AEAAAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/wAAAAEAAAABAAAA/4AAAP4AAAD/gAAAAIAEAAAA/4AAAP+AAAAAgAAA/wAAAP+AAAD/AAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAABAIAAgAOABAAACQAAAQEBAQEBAQEBAQCAAwAAAP4AAAABAAAA/wAAAP8ABAAAAP+AAAD/AAAA/4AAAP6AAAAAAQCAAIADgAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/4AAAAGAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAQAAAACAAAD+gAAA/4AAAACAAAACgAAAAAEAgACAA4AEAAALAAABAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP8AAAD/AAAA/wAEAAAA/gAAAAIAAAD8gAAAAQAAAP8AAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIADAAAA/wAAAAEAAAD9AAAAAQAAAP8ABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAAAAQCAAIAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAMAAAD/gAAA/4AAAP4AAAD/gAAAAQAAAAEAAAD+gAQAAAD/gAAA/YAAAP+AAAAAgAAAAQAAAP8AAAACgAAAAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAAEAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAQAAAD/AAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAAAAAQCAAIADgAQAAAUAAAEBAQEBAQCAAQAAAAIAAAD9AAQAAAD9AAAA/4AAAAABAIAAgAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8ABAAAAP+AAAD/gAAAAIAAAACAAAD8gAAAAgAAAP+AAAAAgAAA/gAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAEAAAA/4AAAP+AAAD/gAAAAYAAAPyAAAABAAAAAIAAAACAAAD+AAAAAAAAAgCAAIADgAQAAAsADwAAAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAD9gAAAAoAAAgCAAIADgAQAAAkADQAAAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP6AAAD/AAEAAAABAAAABAAAAP+AAAD+gAAA/4AAAP8AAAADAP6AAAABgAAAAAIAgACABAAEAAAPABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAD/gAAAAIAAAAQAAAD/gAAA/gAAAP8AAAAAgAAA/4AAAACAAAACgAAAAAD9gAAAAIAAAACAAAABgAACAIAAgAOABAAAEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AAQAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAwD/AAAAAQAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/oAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAAAAAAAQCAAIADgAQAAAcAAAEBAQEBAQEBAIADAAAA/wAAAP8AAAD/AAQAAAD/gAAA/QAAAAMAAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAP+ABAAAAP0AAAADAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIADgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAD/gAAA/wAAAP+AAAD/gAQAAAD+AAAAAgAAAP4AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAIAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAQAAAP8AAAD/gAAA/4AAAP+AAAD/AAQAAAD+AAAAAIAAAP+AAAACAAAA/IAAAACAAAAAgAAA/4AAAP+AAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/AAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP8AAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAA/wAAAAEAAAAAgAAAAIAAAACAAAAAAAABAIAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAACAAAAAAAABAIAAgAOABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/gAAA/4AAAAIAAAD9AAAAAIAAAACAAAAAgAAAAIAAAP4ABAAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/wAAAAEAAAD+AAQAAAD/gAAA/YAAAP+AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/gAAAAEAAAD/AAQAAAD8gAAAAIAAAAKAAAAAAAABAIACAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAEAAAMAAAEBAQEAgAMAAAD9AAEAAAD/gAAAAAAAAQEAAoACgAQAAAkAAAEBAQEBAQEBAQEBAAEAAAAAgAAA/4AAAP+AAAD/gAQAAAD/gAAA/wAAAACAAAAAgAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQACgAAA/4AAAP+AAAD/AAAAAQAAAP6AAAD/gAAAAIADAAAA/YAAAACAAAABgAAA/oAAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/gAAA/YABAAAAAQAAAAQAAAD/AAAA/4AAAP6AAAD/gAAAAgD+gAAAAYAAAAABAIAAgAOAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAAAQAAAP+AAAD+AAAA/4AAAACAAwAAAP+AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAoABAAAA/YAAAP+AAAAAgAAAAYD/AAAAAQAAAAQAAAD8gAAAAIAAAAGAAAAAgAAA/4D+gAAAAYAAAAACAIAAgAOAAwAADQARAAABAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/gAAAAGAAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP8AAAD/gAAA/4AAAACAAAABgAAAAAD/gAAAAIAAAAABAQAAgAOAA4AACwAAAQEBAQEBAQEBAQEBAYACAAAA/oAAAAEAAAD/AAAA/wAAAACAA4AAAP+AAAD/AAAA/4AAAP8AAAACgAAAAAAAAgCAAIADgAOAAA8AEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAABgAAA/oAAAP+AAAAAgACAAAABAAAAA4AAAP+AAAD+AAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAAP8AAAABAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/AAAA/wAAAP8ABAAAAP8AAAD/gAAA/gAAAAIAAAD+AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP+AAAD/gAAA/YAAAAACAIAAgAOABAAAAwAPAAABAQEBAQEBAQEBAQEBAQEBAoABAAAA/wAAAAEAAAD/gAAA/gAAAP+AAAABAAAAAQAEAAAA/4AAAP+AAAD+AAAA/4AAAACAAAABAAAA/wAAAAABAIAAgAOAA4AAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAQAAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AA4AAAP8AAAAAgAAA/4AAAP8AAAD/gAAA/4AAAACAAAAAgAAA/wAAAAAAAAEBgACAAwAEAAAHAAABAQEBAQEBAQGAAQAAAACAAAD/AAAA/4AEAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIAEAAMAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAMAAAD/gAAAAIAAAP+AAAD+AAAAAYAAAP+AAAAAgAAA/oAAAAIAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAABAAAAAIAAAP8AAAD/gAAA/4AAAP8AAwAAAP+AAAAAgAAA/4AAAP4AAAABgAAA/4AAAP8AAAAAAAACAIAAgAOAAwAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP6AAAD/gAAAAIAAAAGAAAAAAP6AAAABgAACAIAAgAOAAwAACQANAAABAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAA/oAAAP8AAQAAAAEAAAADAAAA/4AAAP+AAAD/gAAA/wAAAAIA/4AAAACAAAAAAgCAAIAEAAMAAA0AEQAAAQEBAQEBAQEBAQEBAQEBAQEBAQACgAAAAIAAAP+AAAD/AAAA/oAAAP+AAAAAgACAAAABAAAAAwAAAP6AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAA/4AAAACAAAAAAQEAAIADgAMAAAkAAAEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP+AAAD/AAMAAAD/gAAA/wAAAAEAAAD+AAAAAAEAgACABAADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP6AAAABgAAAAIAAAP+AAAD9AAAAAgAAAP6AAAD/gAAAAIADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAP8AAAAAgAAAAQAAAP+AAAD+gAAA/4AAAP+AAAAAgAOAAAD/gAAA/4AAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAQAAAP+AAAD/gAAA/oAAAP+AAwAAAP4AAAAAgAAAAYAAAP2AAAAAgAAA/4AAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+AAwAAAP6AAAABgAAA/oAAAP+AAAD/gAAAAIAAAACAAAAAAAABAIAAgAQAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/4AAAP8AAAD/gAAA/wAAAP+AAwAAAP6AAAAAgAAA/4AAAAGAAAD+AAAA/4AAAACAAAD/gAAAAIAAAAAAAAEAgACAA4ADAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP8AAAD/AAAAAIAAAACAAAD/gAAA/4ADAAAA/4AAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAAGAAAD+gAAA/4ADAAAA/wAAAAEAAAD+AAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP+AAAD/gAAA/4AAAAGAAAD9AAAAAIAAAACAAAAAgAAA/oADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAA/wAAAP+AAAAAgAAAAQAAAP6AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAAABAYAAgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPyAAAAAAAABAQAAgAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAGAAAAAgAAAAIAAAP+AAAD/gAAA/oAAAAEAAAAAgAAA/4AAAP8ABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAAAAEAgAGAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAACAAAD/gAAA/wAAAP8AAAD/gAAAAIADAAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAYAAAAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAAA/wAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAABAAAAAQAAAACAAAAAgAAAAAAAAQIAAAAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD8AAAAAAAAAgCAAIADgAQAABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP8AAAABAAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAA/wAAAACAAAAAgAGAAIAAAP+ABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAAAAAAAP+AAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAAAgAAA/wAAAAEAAAD/AAAA/wAAAP8AAAABAAAA/wAAAACAAAD/gAQAAAD+gAAAAYAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABACAAIAEAAQAABcAGwAfACMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP4AAAABgAAAAIAAAACAAAD/gAAA/YAAAAIAAAD+gAAA/4AAAP+AAAAAgAEAAAAAgAAAAQAAgAAA/4D9AACAAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAACAAAAAgAAAAQAAAP8A/4AAAACAAQAAAP+AAAD+gAAA/4AAAAAEAIAAgAQAA4AAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAQIAAAAEAAQAAAkAAAEBAQEBAQEBAQEDgACAAAD+AAAAAIAAAACAAAAAgAQAAAD8AAAAAQAAAAEAAAABAAAAAAgAAAAABAAEAAADAAcACwAPABMAFwAbAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAA/wACAAEAAAD/AP8AAQAAAP8AAgABAAAA/wD9AAEAAAD/AAIAAQAAAP8A/wABAAAA/wACAAEAAAD/AAQAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQIAAAADAAQAAAMAAAEBAQECAAEAAAD/AAQAAAD8AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP6AAAD/gAAA/oAAAAABAgAAAAQAAgAAAwAAAQEBAQIAAgAAAP4AAgAAAP4AAAAAAAAEAIAAAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+ABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAAABAAAAPwAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAoABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAD/gAOAAAD+AAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAA/wAAAAEAAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAAAEAAAA/gAAAP+AAAD/gAAA/4AAAP+ABAAAAPwAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIAEAAOAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAOAAAD/gAAAAIAAAP8AAAABAAAA/oAAAAGAAAD9AAAAAIAAAP+AAAABAAAA/wAAAAGAAAD+gAAAAAAAAQAAAAACAAQAAAkAAAEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD+AAQAAAD/AAAA/wAAAP8AAAD/AAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQKAAYAAAP8AAAD/AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAEAAAA/wAAAP+AAAD/gAAA/wAAAP8AAAABgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD8AAAAAIAAAACAAAAAgAIAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgAAAAAEAAQAAAMABwAAAQEBAQEBAQEAAAIAAAD+AAIAAgAAAP4ABAAAAP4AAAAAAAAA/gAAAAAEAAACAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8ABAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAABAIAAAAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQECAAEAAAD/AAEAAQAAAP8A/wABAAAA/wABAAEAAAD/AAQAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAEDAAAABAAEAAADAAABAQEBAwABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD9AAAA/wAEAAAA/wAAAP0AAAAAAQAAAAABAAQAAAMAAAEBAQEAAAEAAAD/AAQAAAD8AAAAAAAAAwCAAIADAAOAAAMABwALAAABAQEBAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AAQAAgAAA/4ADgAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAAABAYABgAQABAAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAAEAAAD+gAAA/4AAAP+ABAAAAP8AAAD/gAAA/wAAAACAAAAAgAAAAAAAAQAAAYACgAQAAAsAAAEBAQEBAQEBAQEBAQGAAQAAAP+AAAD/gAAA/oAAAAEAAAAAgAQAAAD+gAAA/4AAAP+AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAwABAAAA/AAAAAEAAAABAAAAAQAEAAAA/AAAAAKAAAAAgAAAAIAAAAABAIAAgAMABAAACwAAAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP0AAAD/gAAAAIAAAAEAAAAAgAAAAAAAAQAAAAAEAAQAAAUAAAEBAQEBAQAAAQAAAAMAAAD8AAQAAAD9AAAA/wAAAAACAIAAgAMAAoAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQABgAAAAIAAAP+AAAD+gAAAAQAAAP8A/4AAgAAA/4ACgAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAMABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAABAAAA/wAAAAEA/oAAgAAA/4AEAAAA/QAAAP+AAAAAgAAAAQAAAACAAAD/gAAA/wAAAAABAIAAgAQABAAADQAAAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP+AAAD9gAAA/4AAAACAAAABAAAAAIAAAAACAAAAAAQABAAAAwAHAAABAQEBAQEBAQAABAAAAPwAAQAAAAIAAAAEAAAA/AAAAAMA/gAAAAIAAAEAgACABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAD/gAAA/oAAAP+AAAAAgAAAAQAEAAAA/4AAAP+AAAD/gAAA/oAAAP+AAAAAgAAAAQAAAACAAAAAAQAAAAACgAKAAAsAAAEBAQEBAQEBAQEBAQAAAYAAAACAAAAAgAAA/wAAAP+AAAD/AAKAAAD/gAAA/4AAAP6AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD/AAAA/QAEAAAA/AAAAAMAAAAAAQCAAIAEAAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAABAAAA/wAAAP+AAAD+gAAA/4AAAACAAAABAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAAEAAAAAgAAAAAEBgAAABAACgAALAAABAQEBAQEBAQEBAQECgAGAAAD/AAAA/4AAAP8AAAAAgAAAAIACgAAA/wAAAP+AAAD/AAAAAYAAAACAAAAAAAABAAAAAAQABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPwABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAABAAADAAABAQEBAAAEAAAA/AABAAAA/wAAAAAAAAEAAAAABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQEDgACAAAD8AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAEAAAA/AAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAQAAAgAEAAQAAAMAAAEBAQEAAAQAAAD8AAQAAAD+AAAAAAAAAgCAAIACAAOAAAMABwAAAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAAEAIAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAABAAAAPyAAAADAP+AAAAAgP8A/4AAAACA/wD/gAAAAIAAAQAAAAAEAAQAAAUAAAEBAQEBAQMAAQAAAPwAAAADAAQAAAD8AAAAAQAAAAACAIAAgAQABAAAAwAHAAABAQEBAQEBAQCAA4AAAPyAAYAAAACAAAAEAAAA/IAAAAIA/4AAAACAAAMAgACABAAEAAADAAcACwAAAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgP4A/4AAAACAAAAABAAAAIAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD8AAAABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAYAgACABAAEAAADAAcACwAPABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/oAAAACAAAD+gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAID/AP+AAAAAgAAA/4AAAACAAAEAgACAAQADgAADAAABAQEBAIAAgAAA/4ADgAAA/QAAAAAAAAUAgACABAAEAAADAAcACwAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/YAAAACAAAABgAAAAIAAAAQAAAD8gAAAAwD/gAAAAIAAAP+AAAAAgP4A/4AAAACAAAD/gAAAAIAAAAABAAADAAQABAAAAwAAAQEBAQAABAAAAPwABAAAAP8AAAAAAAAHAIAAgAQABAAAAwAHAAsADwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAABgAAAAIAAAP2AAAAAgAAAAYAAAACAAAD9gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAIAAAP+AAAAAgP8A/4AAAACAAAD/gAAAAIAAAAAEAAAAAAQAAgAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8AAgAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQAAAAAEAAQAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAQAAAD/gAAA/4AAAP+AAAD9gAAAAAEBAAAAAgAEAAADAAABAQEBAQABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQECgAGAAAD8AAAAAIAAAACAAAAAgAAAAQAEAAAA/AAAAAGAAAABAAAAAIAAAACAAAAAAAABAAABAAQAAgAAAwAAAQEBAQAABAAAAPwAAgAAAP8AAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAgACAAAA/AAAAACAAAAAgAAAAIAAAACABAAAAPwAAAACAAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEDAAEAAAD8AAAAAQAAAAEAAAABAAIAAAD+AAAAAIAAAACAAAAAgAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAIAAAAAgAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/4AAAP4AAAAAAAADAAAAAAQABAAAGwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAIAAYAAAACAAAD/gAAA/4AAAP+AAAD/gP4AAIAAAACAAAAAgAAAAIAAAP6AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAQAAAP+AAAD+gAAAAIAAAACAAAAAgAAA/oAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAIAAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAGAAAABAAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAAAAAAEAAAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAYAAAP6AAgABgAAA/oD9gAGAAAD+gAIAAYAAAP6ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAP6AAAAAAQIAAgAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD+AAAAAAAABACAAIAEAAQAAAMABwAjACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8A/gAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4ABgACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAAAAA/wAAAP+AAAD/gAAAAIAAAACAAAABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAGAAAD/gAAAAAQAAAAABAAEAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ADgACAAAD/gPyAAIAAAP+AA4AAgAAA/4AEAAAA/4AAAACAAAD/gAAA/QAAAP+AAAAAgAAA/4AAAAABAAAAAAIAAgAAAwAAAQEBAQAAAgAAAP4AAgAAAP4AAAAAAAAEAAAAAAIABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAQABAAAA/wD/AAEAAAD/AAEAAQAAAP8ABAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQCAAQADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAAGAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAOAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAAAABAQABAAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAACAAAD+gAAAAYAAAP+AAAABAAAAAIAAAAAAAAEBAAEABAADgAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQIAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAP6AAAABgAAA/4ADgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAOAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAAAAQAAAP+AAAAAAAABAQAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAA/4AAAP6AAAD/gAAAAIAAAACABAAAAP8AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAAAACAIAAgAOAA4AAAwAJAAABAQEBAQEBAQEBAIADAAAA/QAAgAAAAgAAAP8AAAADgAAA/QAAAAKA/gAAAAEAAAABAAAAAAIAgACABAAEAAAbACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAD/gAAAAIAAAACAAAAAgAAA/4AAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4D/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAEAAAIABAADAAADAAABAQEBAAAEAAAA/AADAAAA/wAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/gAEAAAA/gAAAP+AAAD/gAAA/4AAAP+AAAAAAAABAAACAAIABAAAAwAAAQEBAQAAAgAAAP4ABAAAAP4AAAAAAAACAQAAgAOAA4AAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP8AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAACAAAAAgAAA/wAAAACAAIAAAACAAAADgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgP+AAAAAgAADAAAAAAQABAAACwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAGAAAD/gAAA/4AAAP+AAAD/gAAAAIACgAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgACAAIAAAP+AAAD+gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAAAYAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAA/oAAAP6AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgCAAIADgAQAAA8AHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAABAAAAAIAAAP+AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAgAAA/4AAAP8AAAD/AAAA/4AAAACABAAAAP+AAAAAgAAA/wAAAP+AAAAAgAAA/4AAAAEAAAD+gAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAABAAAAAAQAA4AACwAAAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD8AAAAAIAAAACAA4AAAP+AAAD/gAAA/YAAAAKAAAAAgAAAAAAAAQAAAAACAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAAAAAQIAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDgACAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQCAAIAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/oAAAAEAAAD/AAAAAYAAAACAAAAAgAAAAIAAAAAAACAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gPyAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/YAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D8gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gP2AAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/IAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAQAAAAAEAAQAAAsAAAEBAQEBAQEBAQEBAQAABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/oAEAAAA/oAAAP8AAAD/gAAA/4AAAP+AAAAAAAABAAABgAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAAAAAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP2AAAACAAAAAIAAAACAAAAAAAABAYAAAAQAAoAABQAAAQEBAQEBAYACgAAA/oAAAP8AAoAAAP8AAAD+gAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAAACgAAAAIAAAACAAAAAgAAA/AAEAAAA/wAAAP8AAAD/AAAA/wAAAAACAAAAAAQABAAAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAAAEAAAAEAAAA/4AAAP+AAAD/gAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAgAAAAIAAAP8A/wAAAAEAAAEBgAGABAAEAAAFAAABAQEBAQEBgAEAAAABgAAA/YAEAAAA/oAAAP8AAAAAAQAAAAACgAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD+AAAAAoAAAACAAAAAgAAAAAAAAQGAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQGAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAQAAAACAAAAAAAABAAABgAQABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAgAAAP2AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAABgAQAAoAAAwAAAQEBAQAABAAAAPwAAoAAAP8AAAAAAAABAYAAAAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPwAAAAAAAABAYAAAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAKAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD+AAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD9gAAAAgAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAgAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQAAAYACgAKAAAMAAAEBAQEAAAKAAAD9gAKAAAD/AAAAAAAAAQGAAAACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD9gAAAAAAAAQAAAYAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAABAAAAAIAAAAEAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAYACgAAA/AAAAACAAAAAgAAAAIAEAAAA/AAAAAEAAAABAAAAAQAAAAABAAAAAAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAA/oAAAAEAAAABAAAAAIAAAACABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAQAAAAEAAAD+gAAA/wAAAP+AAAD/gAAA/4AEAAAA/wAAAP8AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAABAAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAACgAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAABAAAAAIAAAAAAAAEAAAAABAAEAAAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQAAAAACgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD9gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAQAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAKAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAYACgAQAAAMAAAEBAQEBgAEAAAD/AAQAAAD9gAAAAAAAAQGAAYAEAAKAAAMAAAEBAQEBgAKAAAD9gAKAAAD/AAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAABAAAAAAQABAAAIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQGAAYACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD/AAAAAAAAAQAAAAAEAAKAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAAAAEAAAGAAoAEAAAFAAABAQEBAQEBgAEAAAD9gAAAAYAEAAAA/YAAAAEAAAAAAQAAAAACgAKAAAUAAAEBAQEBAQAAAoAAAP8AAAD+gAKAAAD9gAAAAYAAAAABAAAAAAQABAAAHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAQAAAACAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEBgAEAAAABgAAA/oAAAP8AAAD+gAAAAYAEAAAA/oAAAP8AAAD+gAAAAYAAAAEAAAAAAAABAAAAAAQAAoAABwAAAQEBAQEBAQEAAAQAAAD+gAAA/wAAAP6AAoAAAP8AAAD+gAAAAYAAAAAAAAEBgAAABAAEAAAHAAABAQEBAQEBAQGAAQAAAAGAAAD+gAAA/wAEAAAA/oAAAP8AAAD+gAAAAAAAAQAAAAACgAQAAAcAAAEBAQEBAQEBAYABAAAA/wAAAP6AAAABgAQAAAD8AAAAAYAAAAEAAAAAAAABAAABgAQABAAABwAAAQEBAQEBAQEBgAEAAAABgAAA/AAAAAGABAAAAP6AAAD/AAAAAQAAAAAAAAQBAAEAAwADAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAYABAAAA/wD/gACAAAD/gAGAAIAAAP+A/wABAAAA/wADAAAA/4AAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/4AAAAACAIAAgAOAA4AACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADgAAA/4AAAP4AAAD/gAAAAIAAAAIAAAD/gP8AAAABAAACAAAAAAQABAAAEwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAgAAA/4AAAACAAAABAAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAAAIAAAAAgAAA/4D/gAAA/wAAAP+AAAAAgAAAAQAAAACAABAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP+AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4AEAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAQAAAAAAQABAAAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D8gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAwCAAIADgAQAABcAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAAEAAAD/AAAAAIAAAP+AAAABAAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAP+AAAAAgAAA/4AAAACAAAAEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAYAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAAAQCAAIADgAOAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP+AAAD/AAAA/4AAAP+AAAAAgAOAAAD/gAAA/wAAAP+AAAD/AAAAAQAAAACAAAABAAAAAAAAAgCAAIADgAOAAAMACQAAAQEBAQEBAQEBAQCAAwAAAP0AAYAAAP8AAAACAAAAA4AAAP0AAAACgP8AAAD/AAAAAgAAAAABAIAAgAOAA4AAAwAAAQEBAQCAAwAAAP0AA4AAAP0AAAAAAAACAIAAgAOAA4AAAwALAAABAQEBAQEBAQEBAQEAgAMAAAD9AACAAAACAAAA/4AAAP8AAAADgAAA/QAAAAKA/gAAAAIAAAD/AAAAAQAAAQAAAAAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAAAAgAAAACAAAAAAAABAQABAAMAAwAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAP+AAAD/AAAA/4AAAACAAwAAAP+AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAQAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAACAAAD/gAAA/4AAAAEAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+AAAAAIAAAAGAAAAAgAAA/gAAAAGAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgAAA/4AAAACA/4D/gAAAAIAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+gAAAAYAAAP4AAAAAgAAAAYAAAACAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgP+A/4AAAACAAAD/gAAAAIAABgCAAIAEAAQAABMAFwAbAB8AIwAnAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAAAAEAAAAAgAAAAAAAgAAA/oAAgAAA/4ACAACAAAD/gP4AAIAAAP+AAgAAgAAA/4AEAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAAAIAAAACAAAAAgAAA/4D/gAAAAIABAAAA/4AAAACAAAD/gAAA/oAAAP+AAAAAgAAA/4AAAAACAQAAgAOABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP+AAAD/gAAAAIAAAP+AAAD/gAAA/4AAAACAAAD/gAAAAQAAAP8A/4AAgAAA/4AEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAQABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYACgAAA/4AAAP+AAAD/gAAAAIAAAP+AAAD+gAAAAQAAAP8AAAABAAAAAIAAAP8A/wAAgAAA/4AEAAAA/gAAAAEAAAD/gAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAIAAAACAAAD+gAAA/wAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABAAAAAIAAAACAAAAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP+AAAAAgAAAAQAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAABAAAAAIAAAP+ABAAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABgAAA/4AAAACAAAAAAAABAIAAgAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACABAAAAP+AAAAAgAAA/4AAAP6AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAABgAAAAAAAAQCAAIAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAQAAAsAAAEBAQEBAQEBAQEBAQIAAYAAAP8AAAD/gAAA/wAAAACAAAAAgAQAAAD/AAAA/gAAAP+AAAABAAAAAIAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQGAAoAAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AAAP8AAAAAgAAAAIAEAAAA/QAAAP+AAAABAAAAAIAAAAEAAAD+AAAA/4AAAAEAAAAAgAAAAAAAAAAYASYAAQAAAAAAAAAIAAAAAQAAAAAAAQAIAAgAAQAAAAAAAgAHABAAAQAAAAAAAwAIABcAAQAAAAAABAAQAB8AAQAAAAAABQALAC8AAQAAAAAABgAIADoAAQAAAAAACQAJAEIAAQAAAAAACgA6AEsAAQAAAAAADQARAIUAAQAAAAAADgAyAJYAAQAAAAAAEwAMAMgAAwABBAkAAAAQANQAAwABBAkAAQAQAOQAAwABBAkAAgAOAPQAAwABBAkAAwAQAQIAAwABBAkABAAgARIAAwABBAkABQAWATIAAwABBAkABgAQAUgAAwABBAkACQASAVgAAwABBAkACgB0AWoAAwABBAkADQAiAd4AAwABBAkADgBkAgAAAwABBAkAEwAYAmQoYykgMjAyMlVyc2FGb250UmVndWxhclVyc2FGb250VXJzYUZvbnQgUmVndWxhclZlcnNpb24gMS4wVXJzYUZvbnRVcnNhRnJhbmtBbiBvcGVuIGxpY2VuY2UgZ2VuZXJhbCBwdXJwb3NlIHRleHRtb2RlIGZvbnQgYnkgVXJzYUZyYW5rQ0MwIDEuMCBVbml2ZXJzYWxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL0hlbGxvIFdvcmxkIQAoAGMAKQAgADIAMAAyADIAVQByAHMAYQBGAG8AbgB0AFIAZQBnAHUAbABhAHIAVQByAHMAYQBGAG8AbgB0AFUAcgBzAGEARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAFUAcgBzAGEARgBvAG4AdABVAHIAcwBhAEYAcgBhAG4AawBBAG4AIABvAHAAZQBuACAAbABpAGMAZQBuAGMAZQAgAGcAZQBuAGUAcgBhAGwAIABwAHUAcgBwAG8AcwBlACAAdABlAHgAdABtAG8AZABlACAAZgBvAG4AdAAgAGIAeQAgAFUAcgBzAGEARgByAGEAbgBrAEMAQwAwACAAMQAuADAAIABVAG4AaQB2AGUAcgBzAGEAbABoAHQAdABwAHMAOgAvAC8AYwByAGUAYQB0AGkAdgBlAGMAbwBtAG0AbwBuAHMALgBvAHIAZwAvAHAAdQBiAGwAaQBjAGQAbwBtAGEAaQBuAC8AegBlAHIAbwAvADEALgAwAC8ASABlAGwAbABvACAAVwBvAHIAbABkACEAAAADAAAAAAAAAGYAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\r
2
+ `;class u extends Error{constructor(e,B,t={}){super(e);E(this,"originalError");E(this,"context");this.name="TextmodeError",this.originalError=B,this.context=t}getFormattedMessage(){let e=this.message;if(this.context&&Object.keys(this.context).length>0){e+=`
3
+
4
+ 📋 Context:`;for(const[B,t]of Object.entries(this.context))e+=`
5
+ • ${B}: ${JSON.stringify(t)}`}return this.originalError&&(e+=`
6
+
7
+ 🔗 Original Error: ${this.originalError.message}`),e}}const I={SILENT:0,WARNING:1,ERROR:2,THROW:3},c=class c{constructor(){E(this,"_options",{globalLevel:I.THROW,consolePrefix:"[textmode.js]"})}static getInstance(){return c._instance||(c._instance=new c),c._instance}_handle(A,e,B){const t=this._options.consolePrefix;switch(this._options.globalLevel){case I.SILENT:return!1;case I.WARNING:return console.warn(`${this._options.consolePrefix} ${A}`,e),!1;case I.ERROR:return console.error(`${this._options.consolePrefix} ${A}`,e),!1;case I.THROW:default:const r=new u(A,B,e);throw console.group(`%c${t} 💥 Oops! Something went wrong in your code.`,"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"),console.error(r.getFormattedMessage()),console.groupEnd(),r}}validate(A,e,B){return A?!0:(this._handle(e,B),!1)}setGlobalLevel(A){this._options.globalLevel=A}};E(c,"_instance",null);let d=c;const b=d.getInstance();class _{constructor(A,e=16){E(this,"_font");E(this,"_characters",[]);E(this,"_fontFramebuffer");E(this,"_textureCanvas");E(this,"_textureContext");E(this,"_fontSize",16);E(this,"_textureColumns",0);E(this,"_textureRows",0);E(this,"_maxGlyphDimensions",{width:0,height:0});E(this,"_renderer");E(this,"_fontFace");E(this,"_fontFamilyName","UrsaFont");this._renderer=A,this._fontSize=e,this._textureCanvas=document.createElement("canvas"),this._textureContext=this._textureCanvas.getContext("2d")}async initialize(){const e=await(await fetch(F)).arrayBuffer();this._fontFace=new FontFace(this._fontFamilyName,e),await this._fontFace.load(),document.fonts.add(this._fontFace),this._font=p.parse(e)[0],this._initializeCharacters(),this._calculateMaxGlyphDimensions(),await this._createTextureAtlas()}_initializeCharacters(){const A=[],e=new Map;this._font&&this._font.cmap&&this._font.cmap.tables&&this._font.cmap.tables.forEach(r=>{if(r.format===4&&r.startCount&&r.endCount&&r.idRangeOffset&&r.idDelta)for(let Q=0;Q<r.startCount.length;Q++){const g=r.startCount[Q],i=r.endCount[Q];if(!(g===65535&&i===65535))for(let s=g;s<=i;s++){const n=String.fromCodePoint(s);let o=0;if(r.idRangeOffset[Q]===0)o=s+r.idDelta[Q]&65535;else{const a=r.idRangeOffset[Q]/2+(s-r.startCount[Q])-(r.startCount.length-Q);if(a>=0&&r.glyphIdArray&&a<r.glyphIdArray.length){const P=r.glyphIdArray[a];P!==0&&(o=P+r.idDelta[Q]&65535)}}o&&o>0&&(A.push(n),e.set(n,o))}}else if(r.format===12&&r.groups)for(let Q=0;Q<r.groups.length;Q+=3){const g=r.groups[Q],i=r.groups[Q+1],s=r.groups[Q+2];for(let n=g;n<=i;n++){const o=String.fromCodePoint(n),a=s+(n-g);a>0&&(A.push(o),e.set(o,a))}}});const t=[...new Set(A)].filter(r=>{const Q=r.codePointAt(0)||0;return!(Q>=0&&Q<=31&&Q!==9&&Q!==10&&Q!==13||Q>=127&&Q<=159)});this._characters=t.map((r,Q)=>{const g=r.codePointAt(0)||0,i=Q%256,s=Math.floor(Q/256)%256,n=Math.floor(Q/65536)%256;return{character:r,unicode:g,color:[i,s,n]}})}_calculateMaxGlyphDimensions(){if(this._fontFace&&this._fontFace.status!=="loaded"){this._maxGlyphDimensions={width:this._fontSize,height:this._fontSize};return}this._textureContext.font=`${this._fontSize}px ${this._fontFamilyName}`;let A=0,e=0;for(const{character:B}of this._characters){const t=this._textureContext.measureText(B),r=t.width,Q=t.actualBoundingBoxAscent!==void 0&&t.actualBoundingBoxDescent!==void 0?t.actualBoundingBoxAscent+t.actualBoundingBoxDescent:this._fontSize;r>0&&(A=Math.max(A,r),e=Math.max(e,Q))}this._maxGlyphDimensions={width:Math.ceil(A),height:Math.ceil(e)}}async _createTextureAtlas(){const A=this._characters.length;this._textureColumns=Math.ceil(Math.sqrt(A)),this._textureRows=Math.ceil(A/this._textureColumns);const e=this._maxGlyphDimensions.width*this._textureColumns,B=this._maxGlyphDimensions.height*this._textureRows;this._textureCanvas.width=e,this._textureCanvas.height=B,this._textureCanvas.style.imageRendering="pixelated",this._textureContext.imageSmoothingEnabled=!1,this._textureContext.fillStyle="black",this._textureContext.fillRect(0,0,e,B),this._textureContext.font=`${this._fontSize}px ${this._fontFamilyName}`,this._textureContext.textBaseline="top",this._textureContext.textAlign="left",this._textureContext.fillStyle="white";for(let t=0;t<this._characters.length;t++){const r=t%this._textureColumns,Q=Math.floor(t/this._textureColumns),g=r*this._maxGlyphDimensions.width+this._maxGlyphDimensions.width/2,i=Q*this._maxGlyphDimensions.height+this._maxGlyphDimensions.height/2,s=this._characters[t].character,n=g-this.maxGlyphDimensions.width/2,o=i-this._fontSize/2;this._textureContext.fillText(s,n,o)}this._fontFramebuffer=this._renderer.createFramebuffer(this._textureCanvas.width,this._textureCanvas.height),this._fontFramebuffer.update(this._textureCanvas)}getCharacterColor(A){if(!b.validate(typeof A=="string"&&A.length===1,"Character must be a single character string.",{providedValue:A,method:"getCharacterColor"}))return[0,0,0];const B=this._characters.find(t=>t.character===A);return B?B.color:[0,0,0]}getCharacterColors(A){return b.validate(typeof A=="string"&&A.length>0,"Characters must be a string with at least one character.",{providedValue:A,method:"getCharacterColors"})?A.split("").map(B=>this.getCharacterColor(B)||[0,0,0]):[[0,0,0]]}async loadFont(A){try{const e=await fetch(A);if(!e.ok)throw new u(`Failed to load font file: ${e.status} ${e.statusText}`);const B=await e.arrayBuffer(),t=Date.now();this._fontFamilyName=`CustomFont_${t}`,this._fontFace=new FontFace(this._fontFamilyName,B),await this._fontFace.load(),document.fonts.add(this._fontFace);const r=p.parse(B);if(!r||r.length===0)throw new Error("Failed to parse font file");this._font=r[0],this._initializeCharacters(),this._calculateMaxGlyphDimensions(),await this._createTextureAtlas()}catch(e){throw new u(`Failed to load font: ${e instanceof Error?e.message:"Unknown error"}`,e)}}get fontFramebuffer(){return this._fontFramebuffer}get textureWidth(){return this._textureCanvas.width}get textureHeight(){return this._textureCanvas.height}get textureCanvas(){return this._textureCanvas}get characters(){return this._characters}get charactersString(){return this._characters.map(A=>A.character).join("")}get textureColumns(){return this._textureColumns}get textureRows(){return this._textureRows}get maxGlyphDimensions(){return this._maxGlyphDimensions}get fontSize(){return this._fontSize}get textureDimensions(){return{width:this._textureCanvas.width,height:this._textureCanvas.height}}}class y{constructor(A,e,B,t={}){E(this,"gl");E(this,"_framebuffer");E(this,"_texture");E(this,"_width");E(this,"_height");E(this,"options");E(this,"previousFramebuffer",null);E(this,"previousViewport",[0,0,0,0]);this.gl=A,this._width=e,this._height=B,this.options={filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte",...t},this._texture=this.createTexture(),this._framebuffer=this.gl.createFramebuffer(),this.attachTexture()}createTexture(){const A=this.gl.createTexture();this.gl.bindTexture(this.gl.TEXTURE_2D,A);const e=this.options.filter==="linear"?this.gl.LINEAR:this.gl.NEAREST,B=this.options.wrap==="repeat"?this.gl.REPEAT:this.gl.CLAMP_TO_EDGE;this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,B),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,B);const t=this.options.format==="rgb"?this.gl.RGB:this.gl.RGBA,r=this.options.type==="float"?this.gl.FLOAT:this.gl.UNSIGNED_BYTE;return this.gl.texImage2D(this.gl.TEXTURE_2D,0,t,this._width,this._height,0,t,r,null),this.gl.bindTexture(this.gl.TEXTURE_2D,null),A}attachTexture(){this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,this._framebuffer),this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER,this.gl.COLOR_ATTACHMENT0,this.gl.TEXTURE_2D,this._texture,0),this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,null)}update(A){this.gl.bindTexture(this.gl.TEXTURE_2D,this._texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,A),this.gl.bindTexture(this.gl.TEXTURE_2D,null)}resize(A,e){this._width=A,this._height=e,this.gl.bindTexture(this.gl.TEXTURE_2D,this._texture);const B=this.options.format==="rgb"?this.gl.RGB:this.gl.RGBA,t=this.options.type==="float"?this.gl.FLOAT:this.gl.UNSIGNED_BYTE;this.gl.texImage2D(this.gl.TEXTURE_2D,0,B,this._width,this._height,0,B,t,null)}begin(){this.previousFramebuffer=this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING),this.previousViewport=this.gl.getParameter(this.gl.VIEWPORT),this.bind()}end(){this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,this.previousFramebuffer),this.gl.viewport(this.previousViewport[0],this.previousViewport[1],this.previousViewport[2],this.previousViewport[3])}bind(){this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,this._framebuffer),this.gl.viewport(0,0,this._width,this._height)}get framebuffer(){return this._framebuffer}get texture(){return this._texture}get width(){return this._width}get height(){return this._height}}class G{constructor(A,e,B,t,r){E(this,"gl");E(this,"buffer");E(this,"numVertices");this.gl=A;const Q=A.getParameter(A.VIEWPORT),g=Q[2],i=Q[3];if(g<=0||i<=0)throw new Error(`Invalid viewport dimensions: ${g}x${i}`);const s=e/g*2-1,n=1-B/i*2,o=(e+t)/g*2-1,a=1-(B+r)/i*2;(s<-1||s>1||o<-1||o>1||n<-1||n>1||a<-1||a>1)&&console.warn(`Rectangle coordinates outside NDC range: x1=${s}, y1=${n}, x2=${o}, y2=${a}`);const P=A.getParameter(A.FRAMEBUFFER_BINDING)!==null?new Float32Array([s,a,0,0,o,a,1,0,s,n,0,1,s,n,0,1,o,a,1,0,o,n,1,1]):new Float32Array([s,a,0,1,o,a,1,1,s,n,0,0,s,n,0,0,o,a,1,1,o,n,1,0]);this.numVertices=6,this.buffer=A.createBuffer(),A.bindBuffer(A.ARRAY_BUFFER,this.buffer),A.bufferData(A.ARRAY_BUFFER,P,A.STATIC_DRAW)}draw(){this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.buffer);let A=0,e=1;this.gl.enableVertexAttribArray(A),this.gl.vertexAttribPointer(A,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(e),this.gl.vertexAttribPointer(e,2,this.gl.FLOAT,!1,16,8),this.gl.drawArrays(this.gl.TRIANGLES,0,this.numVertices),this.gl.disableVertexAttribArray(A),this.gl.disableVertexAttribArray(e)}}class f{constructor(A,e,B){E(this,"gl");E(this,"program");E(this,"uniformLocations",new Map);E(this,"attributeLocations",new Map);E(this,"textureUnitCounter",0);this.gl=A,this.program=this.createProgram(e,B),this.cacheLocations()}createProgram(A,e){const B=this.createShader(this.gl.VERTEX_SHADER,A),t=this.createShader(this.gl.FRAGMENT_SHADER,e),r=this.gl.createProgram();if(this.gl.attachShader(r,B),this.gl.attachShader(r,t),this.gl.linkProgram(r),!this.gl.getProgramParameter(r,this.gl.LINK_STATUS)){const Q=this.gl.getProgramInfoLog(r);throw new Error(`Shader program link error: ${Q}`)}return this.gl.deleteShader(B),this.gl.deleteShader(t),r}createShader(A,e){const B=this.gl.createShader(A);return this.gl.shaderSource(B,e),this.gl.compileShader(B),B}cacheLocations(){const A=this.gl.getProgramParameter(this.program,this.gl.ACTIVE_UNIFORMS);for(let B=0;B<A;B++){const t=this.gl.getActiveUniform(this.program,B);if(t){const r=this.gl.getUniformLocation(this.program,t.name);r&&this.uniformLocations.set(t.name,r)}}const e=this.gl.getProgramParameter(this.program,this.gl.ACTIVE_ATTRIBUTES);for(let B=0;B<e;B++){const t=this.gl.getActiveAttrib(this.program,B);if(t){const r=this.gl.getAttribLocation(this.program,t.name);this.attributeLocations.set(t.name,r)}}}use(){this.gl.useProgram(this.program),this.resetTextureUnits()}setUniform(A,e){const B=this.uniformLocations.get(A);if(typeof e=="number")this.gl.uniform1f(B,e);else if(typeof e=="boolean")this.gl.uniform1i(B,e?1:0);else if(Array.isArray(e))switch(e.length){case 2:this.gl.uniform2f(B,e[0],e[1]);break;case 3:this.gl.uniform3f(B,e[0],e[1],e[2]);break;case 4:this.gl.uniform4f(B,e[0],e[1],e[2],e[3]);break;default:console.warn(`Unsupported array length ${e.length} for uniform '${A}'`)}else if(e instanceof WebGLTexture){const t=this.getNextTextureUnit();this.gl.uniform1i(B,t),this.gl.activeTexture(this.gl.TEXTURE0+t),this.gl.bindTexture(this.gl.TEXTURE_2D,e)}else if(e&&typeof e=="object"&&"texture"in e){const t=this.getNextTextureUnit();this.gl.uniform1i(B,t),this.gl.activeTexture(this.gl.TEXTURE0+t),this.gl.bindTexture(this.gl.TEXTURE_2D,e.texture)}else console.warn(`Unsupported uniform type for '${A}':`,typeof e)}getNextTextureUnit(){return this.textureUnitCounter++}resetTextureUnits(){this.textureUnitCounter=0}}var w="attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.0,1.0);}",M="precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}";class T{constructor(A){E(this,"gl");E(this,"imageShader");E(this,"currentShader",null);this.gl=A,this.imageShader=new f(this.gl,w,M),this.setupDefaultState()}setupDefaultState(){this.gl.enable(this.gl.BLEND),this.gl.blendFunc(this.gl.SRC_ALPHA,this.gl.ONE_MINUS_SRC_ALPHA),this.gl.disable(this.gl.DEPTH_TEST)}shader(A){this.currentShader=A,A.use()}setUniform(A,e){this.currentShader.setUniform(A,e)}rect(A,e,B,t){new G(this.gl,A,e,B,t).draw()}createFramebuffer(A,e,B={}){return new y(this.gl,A,e,B)}background(A,e=A,B=A,t=1){this.clear(A/255,e/255,B/255,t)}clear(A=0,e=0,B=0,t=0){this.gl.clearColor(A,e,B,t),this.gl.clear(this.gl.COLOR_BUFFER_BIT)}resetViewport(){this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height)}get context(){return this.gl}image(A,e,B,t,r){this.shader(this.imageShader),this.setUniform("u_texture",A.texture),this.rect(e,B,t??A.width,r??A.height)}}class x{constructor(A,e,B){E(this,"_cols");E(this,"_rows");E(this,"_width");E(this,"_height");E(this,"_offsetX");E(this,"_offsetY");E(this,"_fixedDimensions",!1);E(this,"_canvas");E(this,"_cellWidth");E(this,"_cellHeight");this._canvas=A,this._cellWidth=e,this._cellHeight=B,this.reset()}reset(){this._fixedDimensions||([this._cols,this._rows]=[Math.floor(this._canvas.width/this._cellWidth),Math.floor(this._canvas.height/this._cellHeight)]),this._resizeGrid()}_resizeGrid(){this._width=this._cols*this._cellWidth,this._height=this._rows*this._cellHeight,this._offsetX=Math.floor((this._canvas.width-this._width)/2),this._offsetY=Math.floor((this._canvas.height-this._height)/2)}resizeCellPixelDimensions(A,e){[this._cellWidth,this._cellHeight]=[A,e],this.reset()}resizeGridDimensions(A,e){this._fixedDimensions=!0,[this._cols,this._rows]=[A,e],this._resizeGrid()}resetGridDimensions(){this._fixedDimensions=!1,this.reset()}updateCanvas(A){this._canvas=A,this._fixedDimensions?this._resizeGrid():this.reset()}get cellWidth(){return this._cellWidth}get cellHeight(){return this._cellHeight}get cols(){return this._cols}get rows(){return this._rows}get width(){return this._width}get height(){return this._height}get offsetX(){return this._offsetX}get offsetY(){return this._offsetY}get fixedDimensions(){return this._fixedDimensions}set fixedDimensions(A){this._fixedDimensions=A}}class v{constructor(A){E(this,"webglCanvas");E(this,"captureCanvas");this.captureCanvas=A,this.webglCanvas=this.createOverlayCanvas()}generateUniqueCanvasId(){let A=0,e=`textmodeCanvas${A}`;for(;document.getElementById(e);)A++,e=`textmodeCanvas${A}`;return e}createOverlayCanvas(){var r;const A=document.createElement("canvas");A.width=this.captureCanvas.width,A.height=this.captureCanvas.height,A.className="textmodeCanvas",A.id=this.generateUniqueCanvasId(),A.style.position="absolute",A.style.pointerEvents="none";const e=window.getComputedStyle(this.captureCanvas);let B=parseInt(e.zIndex||"0",10);isNaN(B)&&(B=0),A.style.zIndex=(B+1).toString();const t=this.captureCanvas.getBoundingClientRect();return A.style.width=t.width+"px",A.style.height=t.height+"px",this.positionOverlayCanvas(A),(r=this.captureCanvas.parentNode)==null||r.insertBefore(A,this.captureCanvas.nextSibling),A}positionOverlayCanvas(A){const e=this.captureCanvas.getBoundingClientRect();let B=this.captureCanvas.offsetParent;if(B&&B!==document.body){const t=B.getBoundingClientRect();A.style.top=e.top-t.top+"px",A.style.left=e.left-t.left+"px"}else A.style.top=e.top+window.scrollY+"px",A.style.left=e.left+window.scrollX+"px"}resize(){this.webglCanvas.width=this.captureCanvas.width,this.webglCanvas.height=this.captureCanvas.height;const A=this.captureCanvas.getBoundingClientRect();this.webglCanvas.style.width=A.width+"px",this.webglCanvas.style.height=A.height+"px",this.positionOverlayCanvas(this.webglCanvas)}getWebGLContext(){const A={alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0},e=this.webglCanvas.getContext("webgl2",A)||this.webglCanvas.getContext("webgl",A);if(!e)throw new u("WebGL context could not be created. Ensure your browser supports WebGL.");return e}get canvas(){return this.webglCanvas}get width(){return this.webglCanvas.width}get height(){return this.webglCanvas.height}}var U="precision lowp float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;uniform float u_pixelRatio;varying vec2 v_uv;mat2 rotate2D(float a){float s=sin(a),c=cos(a);return mat2(c,-s,s,c);}void main(){vec2 screen=v_uv*u_captureDimensions;vec2 cellSize=u_gridPixelDimensions/u_gridCellDimensions;vec2 cell=floor(screen/cellSize);vec2 frac=fract(screen/cellSize);vec2 charUV=(cell+0.5)/u_gridCellDimensions;vec4 charMap=texture2D(u_asciiCharacterTexture,charUV);if(charMap.a<0.01){gl_FragColor=u_backgroundMode==0? vec4(0,0,0,1): texture2D(u_captureTexture,v_uv);return;}vec4 fg=texture2D(u_primaryColorTexture,charUV);vec4 bg=texture2D(u_secondaryColorTexture,charUV);vec4 tf=texture2D(u_transformTexture,charUV);bool inv=tf.r>0.5,flipX=tf.g>0.5,flipY=tf.b>0.5;int idx=int(charMap.r*255.0+0.5)+int(charMap.g*255.0+0.5)*256;int col=int(mod(float(idx),u_charsetDimensions.x));int row=idx/int(u_charsetDimensions.x);vec2 base=vec2(float(col),float(row))/u_charsetDimensions;vec2 cellSz=1.0/u_charsetDimensions;vec2 f=frac;if(flipX)f.x=1.0-f.x;if(flipY)f.y=1.0-f.y;vec4 rot=texture2D(u_rotationTexture,charUV);float angle=((rot.r*255.0+rot.g)*360.0)/255.0*0.01745329252;if(abs(angle)>0.01){f=rotate2D(angle)*(f-0.5)+0.5;}if(f.x<0.0||f.x>1.0||f.y<0.0||f.y>1.0){gl_FragColor=inv ? fg : bg;return;}vec4 charTex=texture2D(u_characterTexture,base+f*cellSz);gl_FragColor=charTex.r>0.5? vec4(inv ? bg.rgb : fg.rgb,1.0): vec4(inv ? fg.rgb : bg.rgb,1.0);}",Y="precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;void main(){vec2 cell=floor(gl_FragCoord.xy);vec2 texel=(cell+0.5)/u_gridCellDimensions;gl_FragColor=texture2D(u_sketchTexture,texel);}",R="precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_textureSize;uniform vec2 u_brightnessRange;void main(){vec2 uv=(floor(gl_FragCoord.xy)+0.5)/u_textureSize;vec4 color=texture2D(u_colorSampleFramebuffer,uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;if(brightness<u_brightnessRange.x||brightness>u_brightnessRange.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-u_brightnessRange.x)/(u_brightnessRange.y-u_brightnessRange.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);float u=(idx+0.5)/u_charPaletteSize.x;vec3 charColor=texture2D(u_charPaletteTexture,vec2(u,0.0)).rgb;gl_FragColor=vec4(charColor,color.a);}";class S{constructor(A,e){E(this,"_framebuffer");E(this,"_renderer");E(this,"_colors");this._renderer=A,this._colors=e;const B=Math.max(this._colors.length,1);this._framebuffer=this._renderer.createFramebuffer(B,1,{filter:"nearest",wrap:"clamp",format:"rgba"}),this._updateFramebuffer()}_updateFramebuffer(){if(!this._framebuffer||!this._renderer)return;const A=Math.max(this._colors.length,1),e=1;this._framebuffer.width!==A&&this._framebuffer.resize(A,e);const B=new Uint8Array(A*e*4);for(let r=0;r<A;r++){const Q=r<this._colors.length?this._colors[r]:[0,0,0],g=r*4;B[g]=Q[0],B[g+1]=Q[1],B[g+2]=Q[2],B[g+3]=255}const t=this._renderer.context;t.bindTexture(t.TEXTURE_2D,this._framebuffer.texture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,A,e,0,t.RGBA,t.UNSIGNED_BYTE,B),t.bindTexture(t.TEXTURE_2D,null)}setColors(A){this._colors=A,this._updateFramebuffer()}get colors(){return this._colors}get framebuffer(){return this._framebuffer}get texture(){return this._framebuffer.texture}}class O{constructor(A,e,B){E(this,"renderer");E(this,"fontManager");E(this,"grid");E(this,"_characterFramebuffer");E(this,"_primaryColorFramebuffer");E(this,"_secondaryColorFramebuffer");E(this,"_rotationFramebuffer");E(this,"_transformFramebuffer");this.renderer=A,this.fontManager=e,this.grid=B,this._characterFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._rotationFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows),this._transformFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows)}resize(){this._characterFramebuffer.resize(this.grid.cols,this.grid.rows),this._primaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._secondaryColorFramebuffer.resize(this.grid.cols,this.grid.rows),this._rotationFramebuffer.resize(this.grid.cols,this.grid.rows),this._transformFramebuffer.resize(this.grid.cols,this.grid.rows)}get characterFramebuffer(){return this._characterFramebuffer}get primaryColorFramebuffer(){return this._primaryColorFramebuffer}get secondaryColorFramebuffer(){return this._secondaryColorFramebuffer}get rotationFramebuffer(){return this._rotationFramebuffer}get transformFramebuffer(){return this._transformFramebuffer}}const z={enabled:!0,characters:" .:-=+*%@#",characterColor:[255,255,255,255],characterColorMode:"sampled",backgroundColor:[0,0,0,255],backgroundColorMode:"fixed",invert:!1,rotation:0,flipHorizontally:!1,flipVertically:!1,brightnessRange:[0,255]};class H extends O{constructor(e,B,t){super(e,B,t);E(this,"sampleShader");E(this,"charMappingShader");E(this,"sampleFramebuffer");E(this,"palette");E(this,"options");this.options={...z},this.sampleShader=new f(e.context,w,Y),this.charMappingShader=new f(e.context,w,R),this.sampleFramebuffer=this.renderer.createFramebuffer(this.grid.cols,this.grid.rows,{filter:"nearest",wrap:"clamp",format:"rgba"}),this.palette=new S(this.renderer,this.fontManager.getCharacterColors("0123456789"))}convert(e){this.sampleFramebuffer.begin(),this.renderer.clear(0,0,0,0),this.renderer.shader(this.sampleShader),this.renderer.setUniform("u_sketchTexture",e),this.renderer.setUniform("u_gridCellDimensions",[this.grid.cols,this.grid.rows]),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this.sampleFramebuffer.end(),this._primaryColorFramebuffer.begin(),this.options.characterColorMode==="fixed"?this.renderer.background(this.options.characterColor[0],this.options.characterColor[1],this.options.characterColor[2],this.options.characterColor[3]):(this.renderer.clear(0,0,0,0),this.renderer.image(this.sampleFramebuffer,0,0,this.grid.cols,this.grid.rows)),this._primaryColorFramebuffer.end(),this._secondaryColorFramebuffer.begin(),this.options.backgroundColorMode==="fixed"?this.renderer.background(this.options.backgroundColor[0],this.options.backgroundColor[1],this.options.backgroundColor[2],this.options.backgroundColor[3]):(this.renderer.clear(0,0,0,0),this.renderer.image(this.sampleFramebuffer,0,0,this.grid.cols,this.grid.rows)),this._secondaryColorFramebuffer.end(),this._transformFramebuffer.begin(),this.renderer.background(this.options.invert?255:0,this.options.flipHorizontally?255:0,this.options.flipVertically?255:0),this._transformFramebuffer.end(),this._rotationFramebuffer.begin(),this.renderer.background(this.options.rotation,this.options.rotation,this.options.rotation),this._rotationFramebuffer.end(),this._characterFramebuffer.begin(),this.renderer.clear(0,0,0,0),this.renderer.shader(this.charMappingShader),this.renderer.setUniform("u_colorSampleFramebuffer",this.sampleFramebuffer.texture),this.renderer.setUniform("u_charPaletteTexture",this.palette.texture),this.renderer.setUniform("u_charPaletteSize",[this.palette.colors.length,1]),this.renderer.setUniform("u_textureSize",[this.grid.cols,this.grid.rows]),this.renderer.setUniform("u_brightnessRange",this.options.brightnessRange),this.renderer.rect(0,0,this.grid.cols,this.grid.rows),this._characterFramebuffer.end()}resize(){super.resize(),this.sampleFramebuffer.resize(this.grid.cols,this.grid.rows)}characters(e){this.options.characters=e,this.palette.setColors(this.fontManager.getCharacterColors(e))}characterColor(e,B=e,t=e,r=255){this.options.characterColor=[e,B,t,r]}characterColorMode(e){this.options.characterColorMode=e}backgroundColor(e,B=e,t=e,r=255){this.options.backgroundColor=[e,B,t,r]}backgroundColorMode(e){this.options.backgroundColorMode=e}invert(e){this.options.invert=e}rotation(e){this.options.rotation=e}flipHorizontally(e){this.options.flipHorizontally=e}flipVertically(e){this.options.flipVertically=e}brightnessRange(e){this.options.brightnessRange=e}}class m{constructor(A,e={}){E(this,"captureCanvas");E(this,"textmodeCanvas");E(this,"renderer");E(this,"asciiShader");E(this,"canvasFramebuffer");E(this,"brightnessConverter");E(this,"fontManager");E(this,"grid");E(this,"resizeObserver");E(this,"resultFramebuffer");E(this,"initialized",!1);this.captureCanvas=A,this.textmodeCanvas=new v(A);const B=this.textmodeCanvas.getWebGLContext();this.renderer=new T(B),this.asciiShader=new f(B,w,U),this.canvasFramebuffer=this.renderer.createFramebuffer(A.width,A.height),this.fontManager=new _(this.renderer,e.fontSize??16)}async initialize(){await this.fontManager.initialize();const A=this.fontManager.maxGlyphDimensions;this.grid=new x(this.captureCanvas,A.width,A.height),this.brightnessConverter=new H(this.renderer,this.fontManager,this.grid),this.resultFramebuffer=this.renderer.createFramebuffer(this.grid.width,this.grid.height),this.setupEventListeners(),this.initialized=!0}isInitialized(){return this.initialized}static async create(A,e={}){const B=new m(A,e);return await B.initialize(),B}setupEventListeners(){window.addEventListener("resize",this.resize.bind(this)),window.ResizeObserver&&(this.resizeObserver=new ResizeObserver(()=>{this.resize()}),this.resizeObserver.observe(this.captureCanvas))}async loadFont(A){return this.fontManager.loadFont(A).then(()=>{if(!this.initialized)return;const e=this.fontManager.maxGlyphDimensions;this.grid.resizeCellPixelDimensions(e.width,e.height),this.brightnessConverter.resize(),this.renderer.resetViewport()})}render(){this.canvasFramebuffer.update(this.captureCanvas),this.brightnessConverter.convert(this.canvasFramebuffer),this.resultFramebuffer.begin(),this.renderer.clear(),this.renderer.shader(this.asciiShader),this.renderer.setUniform("u_characterTexture",this.fontManager.fontFramebuffer),this.renderer.setUniform("u_charsetDimensions",[this.fontManager.textureColumns,this.fontManager.textureRows]),this.renderer.setUniform("u_asciiCharacterTexture",this.brightnessConverter.characterFramebuffer.texture),this.renderer.setUniform("u_primaryColorTexture",this.brightnessConverter.primaryColorFramebuffer.texture),this.renderer.setUniform("u_secondaryColorTexture",this.brightnessConverter.secondaryColorFramebuffer.texture),this.renderer.setUniform("u_transformTexture",this.brightnessConverter.transformFramebuffer.texture),this.renderer.setUniform("u_rotationTexture",this.brightnessConverter.rotationFramebuffer.texture),this.renderer.setUniform("u_captureTexture",this.canvasFramebuffer.texture),this.renderer.setUniform("u_backgroundMode",!1),this.renderer.setUniform("u_captureDimensions",[this.resultFramebuffer.width,this.resultFramebuffer.height]),this.renderer.setUniform("u_gridCellDimensions",[this.grid.cols,this.grid.rows]),this.renderer.setUniform("u_gridPixelDimensions",[this.grid.width,this.grid.height]),this.renderer.setUniform("u_pixelRatio",1),this.renderer.rect(0,0,this.resultFramebuffer.width,this.resultFramebuffer.height),this.resultFramebuffer.end(),this.renderer.clear(),this.renderer.image(this.resultFramebuffer,this.grid.offsetX,this.grid.offsetY,this.resultFramebuffer.width,this.resultFramebuffer.height)}resize(){this.textmodeCanvas.resize(),this.canvasFramebuffer.resize(this.textmodeCanvas.width,this.textmodeCanvas.height),this.grid.updateCanvas(this.textmodeCanvas.canvas),this.resultFramebuffer.resize(this.grid.width,this.grid.height),this.brightnessConverter.resize(),this.renderer.resetViewport()}}h.FontManager=_,h.Grid=x,h.TextmodeCanvas=v,h.Textmodifier=m,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})});
@@ -0,0 +1,42 @@
1
+ import { Framebuffer } from './renderer/Framebuffer';
2
+ import type { Renderer } from './renderer/Renderer';
3
+ /**
4
+ * A 1D color palette stored in a framebuffer that is used to pass colors to shaders.
5
+ *
6
+ * There is no need to modify instances of this class provided by the library,
7
+ * as they are managed internally and can be modified more easily through classes managing them.
8
+ * But you technically could - *if you wanted to* - without breaking anything.
9
+ */
10
+ export declare class ColorPalette {
11
+ /** The framebuffer used to store the color palette. */
12
+ private _framebuffer;
13
+ private _renderer;
14
+ private _colors;
15
+ /**
16
+ * Create a new color palette instance.
17
+ * @param renderer The renderer instance.
18
+ * @param colors The RGB colors to store as [r, g, b] arrays where values are 0-255.
19
+ */
20
+ constructor(renderer: Renderer, colors: [number, number, number][]);
21
+ /**
22
+ * Update the framebuffer with the currently selected colors.
23
+ */
24
+ private _updateFramebuffer;
25
+ /**
26
+ * Sets the colors of the palette and updates the framebuffer.
27
+ * @param newColors The new RGB colors to set as [r, g, b] arrays.
28
+ */
29
+ setColors(newColors: [number, number, number][]): void;
30
+ /**
31
+ * Get the colors of the palette.
32
+ */
33
+ get colors(): [number, number, number][];
34
+ /**
35
+ * Get the framebuffer containing the colors of the palette.
36
+ */
37
+ get framebuffer(): Framebuffer;
38
+ /**
39
+ * Get the texture from the framebuffer for use in shaders.
40
+ */
41
+ get texture(): WebGLTexture;
42
+ }
@@ -0,0 +1,70 @@
1
+ import type { Renderer } from './renderer/Renderer.ts';
2
+ import type { Framebuffer } from './renderer/Framebuffer.ts';
3
+ export interface FontCharacter {
4
+ character: string;
5
+ unicode: number;
6
+ color: [number, number, number];
7
+ }
8
+ export declare class FontManager {
9
+ private _font;
10
+ private _characters;
11
+ private _fontFramebuffer;
12
+ private _textureCanvas;
13
+ private _textureContext;
14
+ private _fontSize;
15
+ private _textureColumns;
16
+ private _textureRows;
17
+ private _maxGlyphDimensions;
18
+ private _renderer;
19
+ private _fontFace;
20
+ private _fontFamilyName;
21
+ /**
22
+ * Creates a new FontManager instance
23
+ * @param renderer Renderer instance for texture creation
24
+ * @param fontSize Font size to use for the texture atlas
25
+ */
26
+ constructor(renderer: Renderer, fontSize?: number);
27
+ /**
28
+ * Initializes the font manager by loading the font and creating the texture atlas
29
+ * @returns Promise that resolves when initialization is complete
30
+ */
31
+ initialize(): Promise<void>;
32
+ /**
33
+ * Initializes the characters array from the font's cmap table
34
+ */
35
+ private _initializeCharacters;
36
+ /**
37
+ * Calculates the maximum glyph dimensions for the given font size
38
+ */
39
+ private _calculateMaxGlyphDimensions;
40
+ /**
41
+ * Creates the texture atlas containing all characters
42
+ */
43
+ private _createTextureAtlas;
44
+ getCharacterColor(character: string): [number, number, number];
45
+ getCharacterColors(characters: string): [number, number, number][];
46
+ /**
47
+ * Updates the font by loading a new font file and regenerating all related properties
48
+ * @param fontPath Path to the .otf or .ttf font file
49
+ * @param fontSize Optional new font size (defaults to current fontSize)
50
+ * @returns Promise that resolves when font update is complete
51
+ */
52
+ loadFont(fontPath: string): Promise<void>;
53
+ get fontFramebuffer(): Framebuffer;
54
+ get textureWidth(): number;
55
+ get textureHeight(): number;
56
+ get textureCanvas(): HTMLCanvasElement;
57
+ get characters(): FontCharacter[];
58
+ get charactersString(): string;
59
+ get textureColumns(): number;
60
+ get textureRows(): number;
61
+ get maxGlyphDimensions(): {
62
+ width: number;
63
+ height: number;
64
+ };
65
+ get fontSize(): number;
66
+ get textureDimensions(): {
67
+ width: number;
68
+ height: number;
69
+ };
70
+ }
@@ -0,0 +1,9 @@
1
+ export declare class TextmodeError extends Error {
2
+ readonly originalError?: Error;
3
+ readonly context?: any;
4
+ constructor(message: string, originalError?: Error, context?: any);
5
+ /**
6
+ * Returns a formatted error message with context for console output
7
+ */
8
+ getFormattedMessage(): string;
9
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Error handling levels for the textmode.js library.
3
+ *
4
+ * Determines how validation failures and errors are processed throughout the library.
5
+ * Each level provides different behavior for error reporting and execution flow control.
6
+ *
7
+ * @example
8
+ *
9
+ * // Set to warning level to log errors without stopping execution
10
+ * p5asciify.setErrorLevel(TextmodeErrorLevel.WARNING);
11
+ */
12
+ export declare const TextmodeErrorLevel: {
13
+ /**
14
+ * Suppress all error output.
15
+ * Validation failures are handled silently without any console messages.
16
+ */
17
+ readonly SILENT: 0;
18
+ /**
19
+ * Log validation failures as warnings.
20
+ * Execution continues normally, but issues are reported to the console.
21
+ */
22
+ readonly WARNING: 1;
23
+ /**
24
+ * Log validation failures as errors.
25
+ * Execution continues, but errors are prominently displayed in the console.
26
+ */
27
+ readonly ERROR: 2;
28
+ /**
29
+ * Throw exceptions on validation failures.
30
+ * Stops execution immediately when errors occur (default behavior).
31
+ */
32
+ readonly THROW: 3;
33
+ };
34
+ type TextmodeErrorLevel = typeof TextmodeErrorLevel[keyof typeof TextmodeErrorLevel];
35
+ /**
36
+ * Options for configuring the error handler.
37
+ * @ignore
38
+ */
39
+ export interface ErrorHandlerOptions {
40
+ /** Global error level */
41
+ globalLevel: TextmodeErrorLevel;
42
+ /** Prefix for console messages */
43
+ consolePrefix: string;
44
+ }
45
+ /**
46
+ * Singleton error handler for textmode.js
47
+ * This class handles errors based on the configured error level.
48
+ * It can log warnings, errors, or throw exceptions based on the global error level.
49
+ * @ignore
50
+ */
51
+ export declare class TextmodeErrorHandler {
52
+ private static _instance;
53
+ private _options;
54
+ private constructor();
55
+ static getInstance(): TextmodeErrorHandler;
56
+ /**
57
+ * Handle an error based on the configured settings
58
+ * @returns true if execution should continue, false if error was handled
59
+ */
60
+ private _handle;
61
+ /**
62
+ * Validate a condition and handle errors if validation fails
63
+ * @param condition The condition to validate
64
+ * @param message Error message if validation fails
65
+ * @param context Additional context for debugging
66
+ * @returns true if validation passed, false if validation failed and was handled
67
+ */
68
+ validate(condition: boolean, message: string, context?: any): boolean;
69
+ /**
70
+ * Set global error level
71
+ */
72
+ setGlobalLevel(level: TextmodeErrorLevel): void;
73
+ }
74
+ /**
75
+ * Singleton instance of the textmode.js error handler.
76
+ * @ignore
77
+ */
78
+ export declare const errorHandler: TextmodeErrorHandler;
79
+ export {};
@@ -0,0 +1,2 @@
1
+ export { TextmodeError } from './Error';
2
+ export { TextmodeErrorHandler, errorHandler, TextmodeErrorLevel, type ErrorHandlerOptions, } from './ErrorHandler';
@@ -0,0 +1,5 @@
1
+ export { FontManager } from './FontManager';
2
+ export { Textmodifier } from './textmode/Textmodifier';
3
+ export { TextmodeCanvas } from './textmode/Canvas';
4
+ export { TextmodeGrid as Grid } from './textmode/Grid';
5
+ export type { TextModeOptions } from './textmode/Textmodifier';
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Minimal Typr.js - TypeScript version
3
+ * Contains only the functionality needed by FontManager
4
+ *
5
+ * Based on Typr.js (https://github.com/photopea/Typr.js)
6
+ * Original work Copyright (c) 2015 Photopea
7
+ *
8
+ * This is a highly optimized, stripped-down version containing only:
9
+ * parse, findTable, cmap, head, hhea, hmtx, maxp tables
10
+ */
11
+ interface CmapTable {
12
+ format: number;
13
+ map?: number[];
14
+ searchRange?: number;
15
+ entrySelector?: number;
16
+ rangeShift?: number;
17
+ endCount?: number[];
18
+ startCount?: number[];
19
+ idDelta?: number[];
20
+ idRangeOffset?: number[];
21
+ glyphIdArray?: number[];
22
+ firstCode?: number;
23
+ groups?: Uint32Array;
24
+ }
25
+ interface CmapData {
26
+ tables: CmapTable[];
27
+ ids: Record<string, number>;
28
+ off: number;
29
+ }
30
+ interface HeadTable {
31
+ fontRevision: number;
32
+ flags: number;
33
+ unitsPerEm: number;
34
+ created: number;
35
+ modified: number;
36
+ xMin: number;
37
+ yMin: number;
38
+ xMax: number;
39
+ yMax: number;
40
+ macStyle: number;
41
+ lowestRecPPEM: number;
42
+ fontDirectionHint: number;
43
+ indexToLocFormat: number;
44
+ glyphDataFormat: number;
45
+ }
46
+ interface HheaTable {
47
+ ascender: number;
48
+ descender: number;
49
+ lineGap: number;
50
+ advanceWidthMax: number;
51
+ minLeftSideBearing: number;
52
+ minRightSideBearing: number;
53
+ xMaxExtent: number;
54
+ caretSlopeRise: number;
55
+ caretSlopeRun: number;
56
+ caretOffset: number;
57
+ res0: number;
58
+ res1: number;
59
+ res2: number;
60
+ res3: number;
61
+ metricDataFormat: number;
62
+ numberOfHMetrics: number;
63
+ }
64
+ interface HmtxTable {
65
+ aWidth: number[];
66
+ lsBearing: number[];
67
+ }
68
+ interface MaxpTable {
69
+ numGlyphs: number;
70
+ }
71
+ export interface TyprFont {
72
+ _data: Uint8Array;
73
+ _index: number;
74
+ _offset: number;
75
+ cmap: CmapData;
76
+ head: HeadTable;
77
+ hhea: HheaTable;
78
+ hmtx: HmtxTable;
79
+ maxp: MaxpTable;
80
+ }
81
+ declare const _default: {
82
+ parse: (buffer: ArrayBuffer) => TyprFont[];
83
+ findTable: (data: Uint8Array, tableName: string, offset: number) => [number, number] | null;
84
+ };
85
+ export default _default;
@@ -0,0 +1,47 @@
1
+ export interface FramebufferOptions {
2
+ filter?: 'nearest' | 'linear';
3
+ wrap?: 'clamp' | 'repeat';
4
+ format?: 'rgba' | 'rgb';
5
+ type?: 'unsigned_byte' | 'float';
6
+ }
7
+ /**
8
+ * Wrapper for WebGL framebuffer with automatic texture creation.
9
+ * Can also be used as a standalone texture (without render target functionality).
10
+ */
11
+ export declare class Framebuffer {
12
+ private gl;
13
+ private _framebuffer;
14
+ private _texture;
15
+ private _width;
16
+ private _height;
17
+ private options;
18
+ private previousFramebuffer;
19
+ private previousViewport;
20
+ constructor(gl: WebGLRenderingContext, width: number, height?: number, options?: FramebufferOptions);
21
+ private createTexture;
22
+ private attachTexture;
23
+ /**
24
+ * Update the framebuffer texture with canvas content
25
+ */
26
+ update(canvas: HTMLCanvasElement): void;
27
+ /**
28
+ * Resize the framebuffer
29
+ */
30
+ resize(width: number, height: number): void;
31
+ /**
32
+ * Begin rendering to this framebuffer (p5.js-like API)
33
+ */
34
+ begin(): void;
35
+ /**
36
+ * End rendering to this framebuffer and restore previous state (p5.js-like API)
37
+ */
38
+ end(): void;
39
+ /**
40
+ * Bind this framebuffer for rendering
41
+ */
42
+ bind(): void;
43
+ get framebuffer(): WebGLFramebuffer | null;
44
+ get texture(): WebGLTexture;
45
+ get width(): number;
46
+ get height(): number;
47
+ }
@@ -0,0 +1,48 @@
1
+ import { Framebuffer, type FramebufferOptions } from "./Framebuffer";
2
+ import { Shader } from "./Shader";
3
+ /**
4
+ * Core WebGL renderer that manages the WebGL context and provides high-level rendering operations
5
+ */
6
+ export declare class Renderer {
7
+ private gl;
8
+ private imageShader;
9
+ private currentShader;
10
+ constructor(gl: WebGLRenderingContext | WebGL2RenderingContext);
11
+ private setupDefaultState;
12
+ /**
13
+ * Set the current shader (p5.js-like API)
14
+ */
15
+ shader(shader: Shader): void;
16
+ /**
17
+ * Set a uniform value for the current shader (p5.js-like API)
18
+ */
19
+ setUniform(name: string, value: any): void;
20
+ /**
21
+ * Draw a rectangle with the current shader (p5.js-like API)
22
+ */
23
+ rect(x: number, y: number, width: number, height: number): void;
24
+ /**
25
+ * Create a new framebuffer
26
+ */
27
+ createFramebuffer(width: number, height: number, options?: FramebufferOptions): Framebuffer;
28
+ /**
29
+ * Fill the current framebuffer with a solid color (p5.js-like API)
30
+ */
31
+ background(r: number, g?: number, b?: number, a?: number): void;
32
+ /**
33
+ * Clear the current framebuffer
34
+ */
35
+ clear(r?: number, g?: number, b?: number, a?: number): void;
36
+ /**
37
+ * Ensure viewport matches canvas dimensions
38
+ */
39
+ resetViewport(): void;
40
+ /**
41
+ * Get the WebGL context
42
+ */
43
+ get context(): WebGLRenderingContext;
44
+ /**
45
+ * Render a framebuffer at a specific position with optional scaling
46
+ */
47
+ image(source: Framebuffer, posX: number, posY: number, width?: number, height?: number): void;
48
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Shader program wrapper with simplified uniform management
3
+ */
4
+ export declare class Shader {
5
+ private gl;
6
+ private program;
7
+ private uniformLocations;
8
+ private attributeLocations;
9
+ private textureUnitCounter;
10
+ constructor(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string);
11
+ private createProgram;
12
+ private createShader;
13
+ private cacheLocations;
14
+ /**
15
+ * Use this shader program
16
+ */
17
+ use(): void;
18
+ /**
19
+ * Set a single uniform value with automatic texture unit management
20
+ */
21
+ setUniform(name: string, value: any): void;
22
+ private getNextTextureUnit;
23
+ /**
24
+ * Reset texture unit counter (useful when starting a new frame)
25
+ */
26
+ resetTextureUnits(): void;
27
+ }