textmode.js 0.1.6-beta.2 → 0.1.6-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/textmode.esm.js +532 -644
- package/dist/textmode.esm.min.js +522 -634
- package/dist/textmode.umd.js +13 -13
- package/dist/textmode.umd.min.js +13 -13
- package/dist/types/rendering/webgl/Framebuffer.d.ts +11 -0
- package/dist/types/rendering/webgl/Renderer.d.ts +14 -2
- package/dist/types/rendering/webgl/StateCache.d.ts +6 -0
- package/package.json +1 -1
package/dist/textmode.esm.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var o = (
|
|
4
|
-
class
|
|
1
|
+
var AA = Object.defineProperty;
|
|
2
|
+
var eA = (n, A, e) => A in n ? AA(n, A, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[A] = e;
|
|
3
|
+
var o = (n, A, e) => eA(n, typeof A != "symbol" ? A + "" : A, e);
|
|
4
|
+
class m extends Error {
|
|
5
5
|
constructor(e, t, r = {}) {
|
|
6
|
-
const i =
|
|
6
|
+
const i = m.createFormattedMessage(e, r);
|
|
7
7
|
super(i);
|
|
8
8
|
o(this, "originalError");
|
|
9
9
|
o(this, "context");
|
|
@@ -19,9 +19,9 @@ class p extends Error {
|
|
|
19
19
|
|
|
20
20
|
📋 Context:`;
|
|
21
21
|
for (const [i, s] of Object.entries(t)) {
|
|
22
|
-
const
|
|
22
|
+
const a = m.formatValue(s);
|
|
23
23
|
r += `
|
|
24
|
-
- ${i}: ${
|
|
24
|
+
- ${i}: ${a}`;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
return r += `
|
|
@@ -38,16 +38,16 @@ class p extends Error {
|
|
|
38
38
|
if (typeof e == "string") return `"${e}"`;
|
|
39
39
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
40
40
|
if (Array.isArray(e))
|
|
41
|
-
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) =>
|
|
41
|
+
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) => m.formatValue(t)).join(", ")}]` : `[${e.slice(0, 3).map((t) => m.formatValue(t)).join(", ")}, ... +${e.length - 3} more]`;
|
|
42
42
|
if (typeof e == "object") {
|
|
43
43
|
const t = Object.keys(e);
|
|
44
|
-
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((s) => `${s}: ${
|
|
44
|
+
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((s) => `${s}: ${m.formatValue(e[s])}`).join(", ")} }` : `{ ${t.slice(0, 2).map((i) => `${i}: ${m.formatValue(e[i])}`).join(", ")}, ... +${t.length - 2} more }`;
|
|
45
45
|
}
|
|
46
46
|
return String(e);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
var
|
|
50
|
-
const
|
|
49
|
+
var tA = /* @__PURE__ */ ((n) => (n[n.SILENT = 0] = "SILENT", n[n.WARNING = 1] = "WARNING", n[n.ERROR = 2] = "ERROR", n[n.THROW = 3] = "THROW", n))(tA || {});
|
|
50
|
+
const y = class y {
|
|
51
51
|
constructor() {
|
|
52
52
|
o(this, "_options", {
|
|
53
53
|
globalLevel: 3
|
|
@@ -55,7 +55,7 @@ const b = class b {
|
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
static getInstance() {
|
|
58
|
-
return
|
|
58
|
+
return y._instance || (y._instance = new y()), y._instance;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Handle an error based on the configured settings
|
|
@@ -71,15 +71,15 @@ const b = class b {
|
|
|
71
71
|
return console.group(
|
|
72
72
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
73
73
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
74
|
-
), console.warn(
|
|
74
|
+
), console.warn(m.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
75
75
|
case 2:
|
|
76
76
|
return console.group(
|
|
77
77
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
78
78
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
79
|
-
), console.error(
|
|
79
|
+
), console.error(m.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
80
80
|
case 3:
|
|
81
81
|
default:
|
|
82
|
-
const i = new
|
|
82
|
+
const i = new m(A, t, e);
|
|
83
83
|
throw console.group(
|
|
84
84
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
85
85
|
"color: #d32f2f; font-weight: bold; background: #ffcdd2; padding: 2px 6px; border-radius: 3px;"
|
|
@@ -103,10 +103,19 @@ const b = class b {
|
|
|
103
103
|
this._options.globalLevel = A;
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
|
-
o(
|
|
107
|
-
let
|
|
108
|
-
const
|
|
109
|
-
|
|
106
|
+
o(y, "_instance", null);
|
|
107
|
+
let k = y;
|
|
108
|
+
const d = k.getInstance(), Z = /* @__PURE__ */ new WeakMap(), rA = /* @__PURE__ */ new WeakMap();
|
|
109
|
+
function U(n, A) {
|
|
110
|
+
Z.set(n, A);
|
|
111
|
+
}
|
|
112
|
+
function $(n) {
|
|
113
|
+
return Z.get(n);
|
|
114
|
+
}
|
|
115
|
+
function M(n, A) {
|
|
116
|
+
rA.set(n, A);
|
|
117
|
+
}
|
|
118
|
+
const S = class S {
|
|
110
119
|
constructor(A, e, t = e, r = {}) {
|
|
111
120
|
o(this, "gl");
|
|
112
121
|
o(this, "_framebuffer");
|
|
@@ -116,6 +125,8 @@ class oA {
|
|
|
116
125
|
o(this, "options");
|
|
117
126
|
o(this, "previousState", null);
|
|
118
127
|
o(this, "_pixels", null);
|
|
128
|
+
// Tracks the last upload origin; no longer required for rendering since we flip at upload time
|
|
129
|
+
o(this, "_isFromCanvasSource", !1);
|
|
119
130
|
this.gl = A, this._width = e, this._height = t, this.options = {
|
|
120
131
|
filter: "nearest",
|
|
121
132
|
wrap: "clamp",
|
|
@@ -124,6 +135,20 @@ class oA {
|
|
|
124
135
|
...r
|
|
125
136
|
}, this._texture = this.createTexture(), this._framebuffer = A.createFramebuffer(), this.attachTexture();
|
|
126
137
|
}
|
|
138
|
+
getMaxTextureUnits() {
|
|
139
|
+
let A = S.maxTextureUnitsMap.get(this.gl);
|
|
140
|
+
return A === void 0 && (A = this.gl.getParameter(this.gl.MAX_TEXTURE_IMAGE_UNITS), S.maxTextureUnitsMap.set(this.gl, A)), A;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Unbind the provided texture from any texture unit where it is currently bound.
|
|
144
|
+
* This prevents framebuffer-texture feedback loops when rendering to this framebuffer.
|
|
145
|
+
*/
|
|
146
|
+
unbindTextureAcrossUnits(A) {
|
|
147
|
+
const e = this.gl, t = e.getParameter(e.ACTIVE_TEXTURE), r = this.getMaxTextureUnits();
|
|
148
|
+
for (let i = 0; i < r; i++)
|
|
149
|
+
e.activeTexture(e.TEXTURE0 + i), e.getParameter(e.TEXTURE_BINDING_2D) === A && e.bindTexture(e.TEXTURE_2D, null);
|
|
150
|
+
e.activeTexture(t);
|
|
151
|
+
}
|
|
127
152
|
createTexture() {
|
|
128
153
|
const { gl: A } = this, e = A.createTexture();
|
|
129
154
|
A.bindTexture(A.TEXTURE_2D, e);
|
|
@@ -143,14 +168,18 @@ class oA {
|
|
|
143
168
|
*/
|
|
144
169
|
update(A) {
|
|
145
170
|
const { gl: e } = this;
|
|
146
|
-
A instanceof HTMLVideoElement && A.readyState < 2
|
|
171
|
+
if (A instanceof HTMLVideoElement && A.readyState < 2)
|
|
172
|
+
return;
|
|
173
|
+
e.bindTexture(e.TEXTURE_2D, this._texture);
|
|
174
|
+
const t = e.getParameter(e.UNPACK_FLIP_Y_WEBGL);
|
|
175
|
+
e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, 1), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, A), e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, t ? 1 : 0), e.bindTexture(e.TEXTURE_2D, null), this._isFromCanvasSource = !1;
|
|
147
176
|
}
|
|
148
177
|
/**
|
|
149
178
|
* Update the framebuffer texture with pixel data
|
|
150
179
|
*/
|
|
151
180
|
updatePixels(A, e, t) {
|
|
152
181
|
const { gl: r } = this;
|
|
153
|
-
r.bindTexture(r.TEXTURE_2D, this._texture), r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e, t, 0, r.RGBA, r.UNSIGNED_BYTE, A), r.bindTexture(r.TEXTURE_2D, null);
|
|
182
|
+
r.bindTexture(r.TEXTURE_2D, this._texture), r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e, t, 0, r.RGBA, r.UNSIGNED_BYTE, A), r.bindTexture(r.TEXTURE_2D, null), this._isFromCanvasSource = !1;
|
|
154
183
|
}
|
|
155
184
|
/**
|
|
156
185
|
* Resize the framebuffer
|
|
@@ -167,7 +196,7 @@ class oA {
|
|
|
167
196
|
this.previousState = {
|
|
168
197
|
framebuffer: A.getParameter(A.FRAMEBUFFER_BINDING),
|
|
169
198
|
viewport: A.getParameter(A.VIEWPORT)
|
|
170
|
-
}, A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.viewport(0, 0, this._width, this._height);
|
|
199
|
+
}, A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.viewport(0, 0, this._width, this._height), this.unbindTextureAcrossUnits(this._texture), M(A, !0), U(A, [0, 0, this._width, this._height]), this._isFromCanvasSource = !1;
|
|
171
200
|
}
|
|
172
201
|
/**
|
|
173
202
|
* End rendering to this framebuffer and restore previous state
|
|
@@ -175,7 +204,7 @@ class oA {
|
|
|
175
204
|
end() {
|
|
176
205
|
if (!this.previousState) return;
|
|
177
206
|
const { gl: A } = this;
|
|
178
|
-
A.bindFramebuffer(A.FRAMEBUFFER, this.previousState.framebuffer), A.viewport(...this.previousState.viewport), this.previousState = null;
|
|
207
|
+
A.bindFramebuffer(A.FRAMEBUFFER, this.previousState.framebuffer), A.viewport(...this.previousState.viewport), M(A, !!this.previousState.framebuffer), U(A, this.previousState.viewport), this.previousState = null;
|
|
179
208
|
}
|
|
180
209
|
/**
|
|
181
210
|
* Load pixel data from the framebuffer into the pixels array
|
|
@@ -189,16 +218,16 @@ class oA {
|
|
|
189
218
|
get(A, e, t, r) {
|
|
190
219
|
const { gl: i } = this;
|
|
191
220
|
if (A === void 0 && e === void 0) {
|
|
192
|
-
const s = new Uint8Array(this._width * this._height * 4),
|
|
193
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(0, 0, this._width, this._height, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER,
|
|
221
|
+
const s = new Uint8Array(this._width * this._height * 4), a = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
222
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(0, 0, this._width, this._height, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, a), s;
|
|
194
223
|
} else if (t === void 0 && r === void 0) {
|
|
195
224
|
(A < 0 || e < 0 || A >= this._width || e >= this._height) && (console.warn("The x and y values passed to Framebuffer.get are outside of its range and will be clamped."), A = Math.max(0, Math.min(A, this._width - 1)), e = Math.max(0, Math.min(e, this._height - 1)));
|
|
196
|
-
const s = new Uint8Array(4),
|
|
197
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, 1, 1, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER,
|
|
225
|
+
const s = new Uint8Array(4), a = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
226
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, 1, 1, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, a), [s[0], s[1], s[2], s[3]];
|
|
198
227
|
} else {
|
|
199
228
|
A = Math.max(0, Math.min(A, this._width - 1)), e = Math.max(0, Math.min(e, this._height - 1)), t = Math.max(1, Math.min(t, this._width - A)), r = Math.max(1, Math.min(r, this._height - e));
|
|
200
|
-
const s = new Uint8Array(t * r * 4),
|
|
201
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, t, r, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER,
|
|
229
|
+
const s = new Uint8Array(t * r * 4), a = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
230
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, t, r, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, a), s;
|
|
202
231
|
}
|
|
203
232
|
}
|
|
204
233
|
/**
|
|
@@ -224,248 +253,15 @@ class oA {
|
|
|
224
253
|
get pixels() {
|
|
225
254
|
return this._pixels;
|
|
226
255
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
o(this, "gl");
|
|
231
|
-
o(this, "x");
|
|
232
|
-
o(this, "y");
|
|
233
|
-
this.gl = A, this.x = e, this.y = t;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
class y {
|
|
237
|
-
constructor(A, e, t, r, i) {
|
|
238
|
-
/** The WebGL rendering context */
|
|
239
|
-
o(this, "gl");
|
|
240
|
-
/** The vertex buffer containing position and texture coordinates */
|
|
241
|
-
o(this, "vertexBuffer");
|
|
242
|
-
/** The number of vertices in this geometry (always 6 for two triangles) */
|
|
243
|
-
o(this, "vertexCount", 6);
|
|
244
|
-
/** Bytes per vertex: depends on position format (vec2 vs vec3) */
|
|
245
|
-
o(this, "bytesPerVertex");
|
|
246
|
-
this.gl = A, this.bytesPerVertex = 16;
|
|
247
|
-
const s = A.getParameter(A.VIEWPORT), n = s[2], g = s[3], B = A.getParameter(A.FRAMEBUFFER_BINDING) !== null, h = e / n * 2 - 1, E = (e + r) / n * 2 - 1;
|
|
248
|
-
let l, c;
|
|
249
|
-
B ? (l = t / g * 2 - 1, c = (t + i) / g * 2 - 1) : (l = 1 - t / g * 2, c = 1 - (t + i) / g * 2);
|
|
250
|
-
let d, u, m, D;
|
|
251
|
-
d = h, m = E, u = l, D = c;
|
|
252
|
-
const C = this.generateVertices(d, u, m, D);
|
|
253
|
-
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, C, A.STATIC_DRAW);
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Generate vertex data for the rectangle with texture coordinates
|
|
257
|
-
* @private
|
|
258
|
-
*/
|
|
259
|
-
generateVertices(A, e, t, r) {
|
|
260
|
-
return new Float32Array([
|
|
261
|
-
A,
|
|
262
|
-
r,
|
|
263
|
-
0,
|
|
264
|
-
1,
|
|
265
|
-
// bottom-left
|
|
266
|
-
t,
|
|
267
|
-
r,
|
|
268
|
-
1,
|
|
269
|
-
1,
|
|
270
|
-
// bottom-right
|
|
271
|
-
A,
|
|
272
|
-
e,
|
|
273
|
-
0,
|
|
274
|
-
0,
|
|
275
|
-
// top-left
|
|
276
|
-
A,
|
|
277
|
-
e,
|
|
278
|
-
0,
|
|
279
|
-
0,
|
|
280
|
-
// top-left
|
|
281
|
-
t,
|
|
282
|
-
r,
|
|
283
|
-
1,
|
|
284
|
-
1,
|
|
285
|
-
// bottom-right
|
|
286
|
-
t,
|
|
287
|
-
e,
|
|
288
|
-
1,
|
|
289
|
-
0
|
|
290
|
-
// top-right
|
|
291
|
-
]);
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Render the rectangle using position and texture coordinate attributes
|
|
295
|
-
*/
|
|
296
|
-
render() {
|
|
297
|
-
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
298
|
-
const A = this.gl.getParameter(this.gl.CURRENT_PROGRAM);
|
|
299
|
-
let e = this.gl.getAttribLocation(A, "a_position"), t = this.gl.getAttribLocation(A, "a_texCoord");
|
|
300
|
-
this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 0), this.gl.enableVertexAttribArray(t), this.gl.vertexAttribPointer(t, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertexCount), this.gl.disableVertexAttribArray(e), this.gl.disableVertexAttribArray(t);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
class aA extends K {
|
|
304
|
-
constructor(e, t, r, i, s) {
|
|
305
|
-
super(e, t, r);
|
|
306
|
-
o(this, "width");
|
|
307
|
-
o(this, "height");
|
|
308
|
-
this.width = i, this.height = s;
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Render the filled rectangle using the existing Rectangle geometry.
|
|
312
|
-
*/
|
|
313
|
-
renderFill() {
|
|
314
|
-
new y(this.gl, this.x, this.y, this.width, this.height).render();
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Render the stroke rectangle as four separate Rectangle instances for each edge.
|
|
318
|
-
* This approach ensures clean corners with proper overlap and leverages existing geometry.
|
|
319
|
-
* @param weight The stroke thickness in pixels
|
|
320
|
-
*/
|
|
321
|
-
renderStroke(e) {
|
|
322
|
-
if (e <= 0) return;
|
|
323
|
-
const t = new y(this.gl, this.x, this.y, this.width, e), r = new y(this.gl, this.x + this.width - e, this.y, e, this.height), i = new y(this.gl, this.x, this.y + this.height - e, this.width, e), s = new y(this.gl, this.x, this.y, e, this.height);
|
|
324
|
-
t.render(), r.render(), i.render(), s.render();
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
class gA {
|
|
328
|
-
constructor(A, e, t, r, i, s) {
|
|
329
|
-
/** The WebGL rendering context */
|
|
330
|
-
o(this, "gl");
|
|
331
|
-
/** The vertex buffer containing position and texture coordinates */
|
|
332
|
-
o(this, "vertexBuffer");
|
|
333
|
-
/** The number of vertices in this geometry (always 6 for two triangles) */
|
|
334
|
-
o(this, "vertexCount", 6);
|
|
335
|
-
/** Bytes per vertex: vec2+vec2 = 16 bytes */
|
|
336
|
-
o(this, "bytesPerVertex");
|
|
337
|
-
this.gl = A, this.bytesPerVertex = 16;
|
|
338
|
-
const n = A.getParameter(A.VIEWPORT), g = n[2], B = n[3], h = A.getParameter(A.FRAMEBUFFER_BINDING) !== null, E = r - e, l = i - t, c = Math.sqrt(E * E + l * l);
|
|
339
|
-
if (c === 0) {
|
|
340
|
-
const rA = this.generateVertices(0, 0, 0, 0);
|
|
341
|
-
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, rA, A.STATIC_DRAW);
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
const d = E / c, m = -(l / c), D = d, C = s / 2, P = e + m * C, F = t + D * C, v = e - m * C, I = t - D * C, R = r + m * C, T = i + D * C, j = r - m * C, W = i - D * C, Z = P / g * 2 - 1, q = v / g * 2 - 1, AA = R / g * 2 - 1, eA = j / g * 2 - 1;
|
|
345
|
-
let M, G, U, Y;
|
|
346
|
-
h ? (M = F / B * 2 - 1, G = I / B * 2 - 1, U = T / B * 2 - 1, Y = W / B * 2 - 1) : (M = 1 - F / B * 2, G = 1 - I / B * 2, U = 1 - T / B * 2, Y = 1 - W / B * 2);
|
|
347
|
-
const tA = this.generateLineVertices(
|
|
348
|
-
Z,
|
|
349
|
-
M,
|
|
350
|
-
q,
|
|
351
|
-
G,
|
|
352
|
-
AA,
|
|
353
|
-
U,
|
|
354
|
-
eA,
|
|
355
|
-
Y
|
|
356
|
-
);
|
|
357
|
-
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, tA, A.STATIC_DRAW);
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Generate vertex data for a rectangle representing the line with texture coordinates
|
|
361
|
-
* @private
|
|
362
|
-
*/
|
|
363
|
-
generateVertices(A, e, t, r) {
|
|
364
|
-
return new Float32Array([
|
|
365
|
-
A,
|
|
366
|
-
r,
|
|
367
|
-
0,
|
|
368
|
-
1,
|
|
369
|
-
// bottom-left
|
|
370
|
-
t,
|
|
371
|
-
r,
|
|
372
|
-
1,
|
|
373
|
-
1,
|
|
374
|
-
// bottom-right
|
|
375
|
-
A,
|
|
376
|
-
e,
|
|
377
|
-
0,
|
|
378
|
-
0,
|
|
379
|
-
// top-left
|
|
380
|
-
A,
|
|
381
|
-
e,
|
|
382
|
-
0,
|
|
383
|
-
0,
|
|
384
|
-
// top-left
|
|
385
|
-
t,
|
|
386
|
-
r,
|
|
387
|
-
1,
|
|
388
|
-
1,
|
|
389
|
-
// bottom-right
|
|
390
|
-
t,
|
|
391
|
-
e,
|
|
392
|
-
1,
|
|
393
|
-
0
|
|
394
|
-
// top-right
|
|
395
|
-
]);
|
|
256
|
+
/** True if the last content update came from a canvas/video or raw pixels (top-left origin). False if rendered via FBO (bottom-left). */
|
|
257
|
+
get isFromCanvasSource() {
|
|
258
|
+
return this._isFromCanvasSource;
|
|
396
259
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
generateLineVertices(A, e, t, r, i, s, n, g) {
|
|
403
|
-
return new Float32Array([
|
|
404
|
-
A,
|
|
405
|
-
e,
|
|
406
|
-
0,
|
|
407
|
-
0,
|
|
408
|
-
// corner1 (start + perpendicular)
|
|
409
|
-
t,
|
|
410
|
-
r,
|
|
411
|
-
0,
|
|
412
|
-
1,
|
|
413
|
-
// corner2 (start - perpendicular)
|
|
414
|
-
i,
|
|
415
|
-
s,
|
|
416
|
-
1,
|
|
417
|
-
0,
|
|
418
|
-
// corner3 (end + perpendicular)
|
|
419
|
-
t,
|
|
420
|
-
r,
|
|
421
|
-
0,
|
|
422
|
-
1,
|
|
423
|
-
// corner2 (start - perpendicular)
|
|
424
|
-
n,
|
|
425
|
-
g,
|
|
426
|
-
1,
|
|
427
|
-
1,
|
|
428
|
-
// corner4 (end - perpendicular)
|
|
429
|
-
i,
|
|
430
|
-
s,
|
|
431
|
-
1,
|
|
432
|
-
0
|
|
433
|
-
// corner3 (end + perpendicular)
|
|
434
|
-
]);
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* Render the line using position and texture coordinate attributes
|
|
438
|
-
*/
|
|
439
|
-
render() {
|
|
440
|
-
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
441
|
-
const A = this.gl.getParameter(this.gl.CURRENT_PROGRAM);
|
|
442
|
-
let e = this.gl.getAttribLocation(A, "a_position"), t = this.gl.getAttribLocation(A, "a_texCoord");
|
|
443
|
-
this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 0), this.gl.enableVertexAttribArray(t), this.gl.vertexAttribPointer(t, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertexCount), this.gl.disableVertexAttribArray(e), this.gl.disableVertexAttribArray(t);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
class BA extends K {
|
|
447
|
-
constructor(e, t, r, i, s) {
|
|
448
|
-
super(e, t, r);
|
|
449
|
-
o(this, "x2");
|
|
450
|
-
o(this, "y2");
|
|
451
|
-
this.x2 = i, this.y2 = s;
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Lines don't support fill rendering - this method does nothing.
|
|
455
|
-
* Lines are rendered only with stroke properties.
|
|
456
|
-
*/
|
|
457
|
-
renderFill() {
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Render the line with the specified stroke weight.
|
|
461
|
-
* @param weight The stroke thickness in pixels
|
|
462
|
-
*/
|
|
463
|
-
renderStroke(e) {
|
|
464
|
-
if (e <= 0) return;
|
|
465
|
-
new gA(this.gl, this.x, this.y, this.x2, this.y2, e).render();
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
class w {
|
|
260
|
+
};
|
|
261
|
+
/** Cache for MAX_TEXTURE_IMAGE_UNITS per-context */
|
|
262
|
+
o(S, "maxTextureUnitsMap", /* @__PURE__ */ new WeakMap());
|
|
263
|
+
let O = S;
|
|
264
|
+
class _ {
|
|
469
265
|
constructor(A, e, t) {
|
|
470
266
|
o(this, "gl");
|
|
471
267
|
o(this, "program");
|
|
@@ -612,13 +408,15 @@ class w {
|
|
|
612
408
|
this.textureUnitCounter = 0;
|
|
613
409
|
}
|
|
614
410
|
}
|
|
615
|
-
var
|
|
616
|
-
class
|
|
411
|
+
var w = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;uniform float u_rotation;uniform vec2 u_center;uniform float u_aspectRatio;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){v_uv=a_texCoord;vec2 pos=a_position;pos-=u_center;pos.x*=u_aspectRatio;pos=rotate2D(-u_rotation)*pos;pos.x/=u_aspectRatio;pos+=u_center;gl_Position=vec4(pos,0.0,1.0);}", iA = "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}", sA = "precision lowp float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}";
|
|
412
|
+
class aA {
|
|
617
413
|
constructor(A) {
|
|
618
414
|
o(this, "gl");
|
|
619
415
|
o(this, "imageShader");
|
|
620
416
|
o(this, "solidColorShader");
|
|
621
417
|
o(this, "currentShader", null);
|
|
418
|
+
// Cached attrib locations for current program
|
|
419
|
+
o(this, "attribCache");
|
|
622
420
|
// Fill state management - default: white fill enabled
|
|
623
421
|
o(this, "currentFillColor", [1, 1, 1, 1]);
|
|
624
422
|
o(this, "fillMode", !0);
|
|
@@ -631,13 +429,18 @@ class lA {
|
|
|
631
429
|
// in degrees
|
|
632
430
|
// State stack for push/pop functionality
|
|
633
431
|
o(this, "stateStack", []);
|
|
634
|
-
|
|
432
|
+
// ----- Immediate-mode helpers that use a single static VBO (no per-call allocation) -----
|
|
433
|
+
o(this, "unitBuffer", null);
|
|
434
|
+
o(this, "bytesPerVertex", 16);
|
|
435
|
+
// vec2 + vec2
|
|
436
|
+
o(this, "scratchFramebuffer", null);
|
|
437
|
+
this.gl = A, this.imageShader = new _(this.gl, w, iA), this.solidColorShader = new _(this.gl, w, sA), this.attribCache = /* @__PURE__ */ new Map(), this.gl.enable(this.gl.BLEND), this.gl.blendEquation(this.gl.FUNC_ADD), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA), U(this.gl, [0, 0, this.gl.canvas.width, this.gl.canvas.height]), M(this.gl, !1);
|
|
635
438
|
}
|
|
636
439
|
/**
|
|
637
440
|
* Set the current shader
|
|
638
441
|
*/
|
|
639
442
|
shader(A) {
|
|
640
|
-
this.currentShader = A, A.use();
|
|
443
|
+
this.currentShader !== A && (this.currentShader = A, A.use());
|
|
641
444
|
}
|
|
642
445
|
/**
|
|
643
446
|
* Sets the fill color for subsequent rendering operations
|
|
@@ -729,13 +532,13 @@ class lA {
|
|
|
729
532
|
* across frames and be managed by push/pop or explicit calls.
|
|
730
533
|
*/
|
|
731
534
|
reset() {
|
|
732
|
-
this.currentShader = null, this.stateStack = [], this.currentRotation = 0
|
|
535
|
+
this.currentShader = null, this.stateStack = [], this.currentRotation = 0;
|
|
733
536
|
}
|
|
734
537
|
createShader(A, e) {
|
|
735
|
-
return new
|
|
538
|
+
return new _(this.gl, A, e);
|
|
736
539
|
}
|
|
737
540
|
createFilterShader(A) {
|
|
738
|
-
return new
|
|
541
|
+
return new _(this.gl, w, A);
|
|
739
542
|
}
|
|
740
543
|
/**
|
|
741
544
|
* Set a uniform value for the current shader
|
|
@@ -747,18 +550,22 @@ class lA {
|
|
|
747
550
|
* Draw a rectangle with the current fill and/or stroke settings
|
|
748
551
|
*/
|
|
749
552
|
rect(A, e, t, r) {
|
|
750
|
-
const i = new aA(this.gl, A, e, t, r);
|
|
751
553
|
if (this.currentShader !== null) {
|
|
752
554
|
if (this.currentRotation !== 0) {
|
|
753
|
-
const { centerX:
|
|
754
|
-
this.setUniform("u_rotation",
|
|
555
|
+
const { centerX: l, centerY: c, radians: f, aspectRatio: u } = this.calculateRotationParams(A, e, t, r);
|
|
556
|
+
this.setUniform("u_rotation", f), this.setUniform("u_center", [l, c]), this.setUniform("u_aspectRatio", u);
|
|
755
557
|
} else
|
|
756
558
|
this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1);
|
|
757
|
-
|
|
559
|
+
this.drawRectImmediate(A, e, t, r), this.currentShader = null;
|
|
758
560
|
return;
|
|
759
561
|
}
|
|
760
|
-
const s = this.solidColorShader,
|
|
761
|
-
|
|
562
|
+
const s = this.solidColorShader, a = this.currentRotation !== 0;
|
|
563
|
+
let g = 0, B = 0, E = 0, h = 1;
|
|
564
|
+
if (a) {
|
|
565
|
+
const l = this.calculateRotationParams(A, e, t, r);
|
|
566
|
+
g = l.centerX, B = l.centerY, E = l.radians, h = l.aspectRatio;
|
|
567
|
+
}
|
|
568
|
+
this.fillMode && (this.shader(s), this.setUniform("u_color", this.currentFillColor), a && (this.setUniform("u_rotation", E), this.setUniform("u_center", [g, B]), this.setUniform("u_aspectRatio", h)), this.drawRectImmediate(A, e, t, r)), this.strokeMode && this.currentStrokeWeight > 0 && (this.shader(s), this.setUniform("u_color", this.currentStrokeColor), a && (this.setUniform("u_rotation", E), this.setUniform("u_center", [g, B]), this.setUniform("u_aspectRatio", h)), this.drawRectStrokeImmediate(A, e, t, r, this.currentStrokeWeight));
|
|
762
569
|
}
|
|
763
570
|
/**
|
|
764
571
|
* Draw a line from (x1, y1) to (x2, y2) with the current stroke settings.
|
|
@@ -769,35 +576,38 @@ class lA {
|
|
|
769
576
|
* @param y2 Y-coordinate of the line end point
|
|
770
577
|
*/
|
|
771
578
|
line(A, e, t, r) {
|
|
772
|
-
if (!this.strokeMode) return;
|
|
773
|
-
const i = new BA(this.gl, A, e, t, r);
|
|
774
579
|
if (this.currentShader !== null) {
|
|
580
|
+
const C = (A + t) / 2, P = (e + r) / 2, p = Math.abs(t - A) || 1, D = Math.abs(r - e) || 1;
|
|
775
581
|
if (this.currentRotation !== 0) {
|
|
776
|
-
const
|
|
777
|
-
this.setUniform("u_rotation",
|
|
582
|
+
const { centerX: x, centerY: I, radians: b, aspectRatio: v } = this.calculateRotationParams(C - p / 2, P - D / 2, p, D);
|
|
583
|
+
this.setUniform("u_rotation", b), this.setUniform("u_center", [x, I]), this.setUniform("u_aspectRatio", v);
|
|
778
584
|
} else
|
|
779
585
|
this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1);
|
|
780
|
-
|
|
586
|
+
const R = this.currentStrokeWeight > 0 ? this.currentStrokeWeight : 1;
|
|
587
|
+
this.drawLineImmediate(A, e, t, r, R), this.currentShader = null;
|
|
781
588
|
return;
|
|
782
589
|
}
|
|
783
|
-
|
|
784
|
-
|
|
590
|
+
if (!this.strokeMode || this.currentStrokeWeight <= 0) return;
|
|
591
|
+
const s = this.solidColorShader, a = (A + t) / 2, g = (e + r) / 2, B = Math.abs(t - A) || 1, E = Math.abs(r - e) || 1, h = this.currentRotation !== 0;
|
|
592
|
+
let l = 0, c = 0, f = 0, u = 1;
|
|
593
|
+
if (h) {
|
|
594
|
+
const C = this.calculateRotationParams(a - B / 2, g - E / 2, B, E);
|
|
595
|
+
l = C.centerX, c = C.centerY, f = C.radians, u = C.aspectRatio;
|
|
596
|
+
}
|
|
597
|
+
this.shader(s), this.setUniform("u_color", this.currentStrokeColor), h && (this.setUniform("u_rotation", f), this.setUniform("u_center", [l, c]), this.setUniform("u_aspectRatio", u)), this.drawLineImmediate(A, e, t, r, this.currentStrokeWeight);
|
|
785
598
|
}
|
|
786
599
|
/**
|
|
787
600
|
* Calculate rotation parameters for built-in shaders (NDC coordinates)
|
|
788
601
|
*/
|
|
789
602
|
calculateRotationParams(A, e, t, r) {
|
|
790
|
-
const i = this.gl.
|
|
791
|
-
|
|
792
|
-
B ? c = E / n * 2 - 1 : c = 1 - E / n * 2;
|
|
793
|
-
const d = this.currentRotation * Math.PI / 180;
|
|
794
|
-
return { centerX: l, centerY: c, radians: d, aspectRatio: g };
|
|
603
|
+
const i = $(this.gl) || [0, 0, this.gl.canvas.width, this.gl.canvas.height], s = i[2], a = i[3], g = s / a, B = A + t / 2, E = e + r / 2, h = B / s * 2 - 1, l = 1 - E / a * 2, c = this.currentRotation * Math.PI / 180;
|
|
604
|
+
return { centerX: h, centerY: l, radians: c, aspectRatio: g };
|
|
795
605
|
}
|
|
796
606
|
/**
|
|
797
607
|
* Create a new framebuffer
|
|
798
608
|
*/
|
|
799
609
|
createFramebuffer(A, e, t = {}) {
|
|
800
|
-
return new
|
|
610
|
+
return new O(this.gl, A, e, t);
|
|
801
611
|
}
|
|
802
612
|
/**
|
|
803
613
|
* Fill the current framebuffer with a solid color
|
|
@@ -812,11 +622,10 @@ class lA {
|
|
|
812
622
|
this.gl.clearColor(A, e, t, r), this.gl.clear(this.gl.COLOR_BUFFER_BIT);
|
|
813
623
|
}
|
|
814
624
|
/**
|
|
815
|
-
* Ensure viewport matches canvas dimensions
|
|
625
|
+
* Ensure viewport matches canvas dimensions
|
|
816
626
|
*/
|
|
817
|
-
resetViewport(
|
|
818
|
-
|
|
819
|
-
this.gl.viewport(0, 0, t, r);
|
|
627
|
+
resetViewport() {
|
|
628
|
+
this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height), U(this.gl, [0, 0, this.gl.canvas.width, this.gl.canvas.height]), M(this.gl, !1);
|
|
820
629
|
}
|
|
821
630
|
/**
|
|
822
631
|
* Get the WebGL context
|
|
@@ -829,26 +638,133 @@ class lA {
|
|
|
829
638
|
* This method is idempotent and safe to call multiple times.
|
|
830
639
|
*/
|
|
831
640
|
dispose() {
|
|
832
|
-
this.imageShader.dispose(), this.solidColorShader.dispose(), this.imageShader = null, this.solidColorShader = null, this.currentShader = null, this.stateStack = [];
|
|
641
|
+
this.scratchFramebuffer && (this.scratchFramebuffer.dispose(), this.scratchFramebuffer = null), this.imageShader.dispose(), this.solidColorShader.dispose(), this.imageShader = null, this.solidColorShader = null, this.currentShader = null, this.stateStack = [];
|
|
833
642
|
}
|
|
834
643
|
/**
|
|
835
644
|
* Render a framebuffer at a specific position with optional scaling
|
|
836
645
|
*/
|
|
837
646
|
image(A, e, t, r, i) {
|
|
647
|
+
const s = this.gl, a = r ?? A.width, g = i ?? A.height, B = s.getParameter(s.FRAMEBUFFER_BINDING);
|
|
648
|
+
if (B && A.framebuffer === B) {
|
|
649
|
+
(!this.scratchFramebuffer || this.scratchFramebuffer.width !== a || this.scratchFramebuffer.height !== g) && (this.scratchFramebuffer && this.scratchFramebuffer.dispose(), this.scratchFramebuffer = this.createFramebuffer(a, g)), this.scratchFramebuffer.begin(), this.clear(0, 0, 0, 0), this.shader(this.imageShader), this.setUniform("u_texture", A.texture), this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1), this.drawRectImmediate(0, 0, a, g), this.scratchFramebuffer.end(), this.shader(this.imageShader);
|
|
650
|
+
const h = this.currentRotation !== 0 ? this.calculateRotationParams(e, t, a, g) : { centerX: 0, centerY: 0, radians: 0, aspectRatio: 1 };
|
|
651
|
+
this.setUniform("u_texture", this.scratchFramebuffer.texture), this.setUniform("u_rotation", h.radians), this.setUniform("u_center", [h.centerX, h.centerY]), this.setUniform("u_aspectRatio", h.aspectRatio), this.drawRectImmediate(e, t, a, g), s.bindTexture(s.TEXTURE_2D, null), this.currentShader = null;
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
838
654
|
this.shader(this.imageShader), this.setUniform("u_texture", A.texture);
|
|
839
|
-
const { centerX:
|
|
655
|
+
const E = this.currentRotation !== 0 ? this.calculateRotationParams(e, t, a, g) : { centerX: 0, centerY: 0, radians: 0, aspectRatio: 1 };
|
|
656
|
+
this.setUniform("u_rotation", E.radians), this.setUniform("u_center", [E.centerX, E.centerY]), this.setUniform("u_aspectRatio", E.aspectRatio), this.drawRectImmediate(e, t, a, g), s.bindTexture(s.TEXTURE_2D, null), this.currentShader = null;
|
|
657
|
+
}
|
|
658
|
+
ensureUnitBuffer() {
|
|
659
|
+
if (this.unitBuffer) return;
|
|
660
|
+
const A = this.gl;
|
|
661
|
+
this.unitBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.unitBuffer);
|
|
662
|
+
}
|
|
663
|
+
enableAttribs() {
|
|
664
|
+
const A = this.gl, e = A.getParameter(A.CURRENT_PROGRAM);
|
|
665
|
+
let t = this.attribCache.get(e);
|
|
666
|
+
return t || (t = {
|
|
667
|
+
a_position: A.getAttribLocation(e, "a_position"),
|
|
668
|
+
a_texCoord: A.getAttribLocation(e, "a_texCoord")
|
|
669
|
+
}, this.attribCache.set(e, t)), A.enableVertexAttribArray(t.a_position), A.vertexAttribPointer(t.a_position, 2, A.FLOAT, !1, this.bytesPerVertex, 0), A.enableVertexAttribArray(t.a_texCoord), A.vertexAttribPointer(t.a_texCoord, 2, A.FLOAT, !1, this.bytesPerVertex, 8), { positionLoc: t.a_position, texLoc: t.a_texCoord };
|
|
670
|
+
}
|
|
671
|
+
disableAttribs(A, e) {
|
|
672
|
+
const t = this.gl;
|
|
673
|
+
t.disableVertexAttribArray(A), t.disableVertexAttribArray(e);
|
|
674
|
+
}
|
|
675
|
+
uploadQuadNDC(A, e, t, r) {
|
|
676
|
+
const i = this.gl;
|
|
677
|
+
this.ensureUnitBuffer(), i.bindBuffer(i.ARRAY_BUFFER, this.unitBuffer);
|
|
678
|
+
const s = 0, a = 0, g = 1, B = 1, E = new Float32Array([
|
|
679
|
+
A,
|
|
680
|
+
r,
|
|
681
|
+
0,
|
|
682
|
+
s,
|
|
683
|
+
// bottom-left
|
|
684
|
+
t,
|
|
685
|
+
r,
|
|
686
|
+
1,
|
|
687
|
+
a,
|
|
688
|
+
// bottom-right
|
|
689
|
+
A,
|
|
840
690
|
e,
|
|
691
|
+
0,
|
|
692
|
+
g,
|
|
693
|
+
// top-left
|
|
694
|
+
A,
|
|
695
|
+
e,
|
|
696
|
+
0,
|
|
697
|
+
g,
|
|
698
|
+
// top-left
|
|
841
699
|
t,
|
|
842
|
-
r
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
700
|
+
r,
|
|
701
|
+
1,
|
|
702
|
+
a,
|
|
703
|
+
// bottom-right
|
|
704
|
+
t,
|
|
705
|
+
e,
|
|
706
|
+
1,
|
|
707
|
+
B
|
|
708
|
+
// top-right
|
|
709
|
+
]);
|
|
710
|
+
i.bufferData(i.ARRAY_BUFFER, E, i.DYNAMIC_DRAW);
|
|
711
|
+
}
|
|
712
|
+
toNDC(A, e) {
|
|
713
|
+
const t = this.gl, r = $(t) || [0, 0, t.canvas.width, t.canvas.height], i = r[2], s = r[3], a = A / i * 2 - 1, g = 1 - e / s * 2;
|
|
714
|
+
return { nx: a, ny: g };
|
|
715
|
+
}
|
|
716
|
+
drawRectImmediate(A, e, t, r) {
|
|
717
|
+
const i = this.toNDC(A, e), s = this.toNDC(A + t, e + r);
|
|
718
|
+
this.uploadQuadNDC(i.nx, i.ny, s.nx, s.ny);
|
|
719
|
+
const a = this.enableAttribs();
|
|
720
|
+
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6), this.disableAttribs(a.positionLoc, a.texLoc);
|
|
721
|
+
}
|
|
722
|
+
drawRectStrokeImmediate(A, e, t, r, i) {
|
|
723
|
+
this.drawRectImmediate(A, e, t, i), this.drawRectImmediate(A + t - i, e, i, r), this.drawRectImmediate(A, e + r - i, t, i), this.drawRectImmediate(A, e, i, r);
|
|
724
|
+
}
|
|
725
|
+
drawLineImmediate(A, e, t, r, i) {
|
|
726
|
+
const s = t - A, a = r - e, g = Math.hypot(s, a);
|
|
727
|
+
if (g === 0) {
|
|
728
|
+
this.drawRectImmediate(A - i / 2, e - i / 2, i, i);
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
const B = s / g, h = -(a / g), l = B, c = i / 2, f = A + h * c, u = e + l * c, C = A - h * c, P = e - l * c, p = t + h * c, D = r + l * c, R = t - h * c, x = r - l * c, I = this.toNDC(f, u), b = this.toNDC(C, P), v = this.toNDC(p, D), W = this.toNDC(R, x), F = this.gl;
|
|
732
|
+
this.ensureUnitBuffer(), F.bindBuffer(F.ARRAY_BUFFER, this.unitBuffer);
|
|
733
|
+
const q = new Float32Array([
|
|
734
|
+
I.nx,
|
|
735
|
+
I.ny,
|
|
736
|
+
0,
|
|
737
|
+
0,
|
|
738
|
+
b.nx,
|
|
739
|
+
b.ny,
|
|
740
|
+
0,
|
|
741
|
+
1,
|
|
742
|
+
v.nx,
|
|
743
|
+
v.ny,
|
|
744
|
+
1,
|
|
745
|
+
0,
|
|
746
|
+
b.nx,
|
|
747
|
+
b.ny,
|
|
748
|
+
0,
|
|
749
|
+
1,
|
|
750
|
+
W.nx,
|
|
751
|
+
W.ny,
|
|
752
|
+
1,
|
|
753
|
+
1,
|
|
754
|
+
v.nx,
|
|
755
|
+
v.ny,
|
|
756
|
+
1,
|
|
757
|
+
0
|
|
758
|
+
]);
|
|
759
|
+
F.bufferData(F.ARRAY_BUFFER, q, F.DYNAMIC_DRAW);
|
|
760
|
+
const X = this.enableAttribs();
|
|
761
|
+
F.drawArrays(F.TRIANGLES, 0, 6), this.disableAttribs(X.positionLoc, X.texLoc);
|
|
846
762
|
}
|
|
847
763
|
}
|
|
848
764
|
var Q = {};
|
|
849
|
-
Q.parse = function(
|
|
850
|
-
var A = function(i, s,
|
|
851
|
-
var B = Q.T,
|
|
765
|
+
Q.parse = function(n) {
|
|
766
|
+
var A = function(i, s, a, g) {
|
|
767
|
+
var B = Q.T, E = {
|
|
852
768
|
cmap: B.cmap,
|
|
853
769
|
head: B.head,
|
|
854
770
|
hhea: B.hhea,
|
|
@@ -856,119 +772,119 @@ Q.parse = function(a) {
|
|
|
856
772
|
hmtx: B.hmtx,
|
|
857
773
|
loca: B.loca,
|
|
858
774
|
glyf: B.glyf
|
|
859
|
-
},
|
|
860
|
-
for (var l in
|
|
861
|
-
var c = Q.findTable(i, l,
|
|
775
|
+
}, h = { _data: i, _index: s, _offset: a };
|
|
776
|
+
for (var l in E) {
|
|
777
|
+
var c = Q.findTable(i, l, a);
|
|
862
778
|
if (c) {
|
|
863
|
-
var
|
|
864
|
-
u == null && (u =
|
|
779
|
+
var f = c[0], u = g[f];
|
|
780
|
+
u == null && (u = E[l].parseTab(i, f, c[1], h)), h[l] = g[f] = u;
|
|
865
781
|
}
|
|
866
782
|
}
|
|
867
|
-
return
|
|
868
|
-
}, e = new Uint8Array(
|
|
783
|
+
return h;
|
|
784
|
+
}, e = new Uint8Array(n), t = {}, r = A(e, 0, 0, t);
|
|
869
785
|
return [r];
|
|
870
786
|
};
|
|
871
|
-
Q.findTable = function(
|
|
872
|
-
for (var t = Q.B, r = t.readUshort(
|
|
873
|
-
var
|
|
874
|
-
t.readUint(
|
|
875
|
-
var g = t.readUint(
|
|
876
|
-
if (
|
|
787
|
+
Q.findTable = function(n, A, e) {
|
|
788
|
+
for (var t = Q.B, r = t.readUshort(n, e + 4), i = e + 12, s = 0; s < r; s++) {
|
|
789
|
+
var a = t.readASCII(n, i, 4);
|
|
790
|
+
t.readUint(n, i + 4);
|
|
791
|
+
var g = t.readUint(n, i + 8), B = t.readUint(n, i + 12);
|
|
792
|
+
if (a == A) return [g, B];
|
|
877
793
|
i += 16;
|
|
878
794
|
}
|
|
879
795
|
return null;
|
|
880
796
|
};
|
|
881
797
|
Q.T = {};
|
|
882
798
|
Q.B = {
|
|
883
|
-
readShort: function(
|
|
799
|
+
readShort: function(n, A) {
|
|
884
800
|
var e = Q.B.t.uint16;
|
|
885
|
-
return e[0] =
|
|
801
|
+
return e[0] = n[A] << 8 | n[A + 1], Q.B.t.int16[0];
|
|
886
802
|
},
|
|
887
|
-
readUshort: function(
|
|
888
|
-
return
|
|
803
|
+
readUshort: function(n, A) {
|
|
804
|
+
return n[A] << 8 | n[A + 1];
|
|
889
805
|
},
|
|
890
|
-
readUshorts: function(
|
|
806
|
+
readUshorts: function(n, A, e) {
|
|
891
807
|
for (var t = [], r = 0; r < e; r++)
|
|
892
|
-
t.push(Q.B.readUshort(
|
|
808
|
+
t.push(Q.B.readUshort(n, A + r * 2));
|
|
893
809
|
return t;
|
|
894
810
|
},
|
|
895
|
-
readUint: function(
|
|
811
|
+
readUint: function(n, A) {
|
|
896
812
|
var e = Q.B.t.uint8;
|
|
897
|
-
return e[3] =
|
|
813
|
+
return e[3] = n[A], e[2] = n[A + 1], e[1] = n[A + 2], e[0] = n[A + 3], Q.B.t.uint32[0];
|
|
898
814
|
},
|
|
899
|
-
readASCII: function(
|
|
900
|
-
for (var t = "", r = 0; r < e; r++) t += String.fromCharCode(
|
|
815
|
+
readASCII: function(n, A, e) {
|
|
816
|
+
for (var t = "", r = 0; r < e; r++) t += String.fromCharCode(n[A + r]);
|
|
901
817
|
return t;
|
|
902
818
|
},
|
|
903
819
|
// Simplified typed array buffer - only what's needed
|
|
904
820
|
t: function() {
|
|
905
|
-
var
|
|
821
|
+
var n = new ArrayBuffer(8);
|
|
906
822
|
return {
|
|
907
|
-
uint8: new Uint8Array(
|
|
908
|
-
int16: new Int16Array(
|
|
909
|
-
uint16: new Uint16Array(
|
|
910
|
-
uint32: new Uint32Array(
|
|
823
|
+
uint8: new Uint8Array(n),
|
|
824
|
+
int16: new Int16Array(n),
|
|
825
|
+
uint16: new Uint16Array(n),
|
|
826
|
+
uint32: new Uint32Array(n)
|
|
911
827
|
};
|
|
912
828
|
}()
|
|
913
829
|
};
|
|
914
830
|
Q.T.cmap = {
|
|
915
|
-
parseTab: function(
|
|
831
|
+
parseTab: function(n, A, e) {
|
|
916
832
|
var t = { tables: [], ids: {}, off: A };
|
|
917
|
-
|
|
833
|
+
n = new Uint8Array(n.buffer, A, e), A = 0;
|
|
918
834
|
var r = Q.B, i = r.readUshort, s = Q.T.cmap;
|
|
919
|
-
i(
|
|
920
|
-
var
|
|
835
|
+
i(n, A), A += 2;
|
|
836
|
+
var a = i(n, A);
|
|
921
837
|
A += 2;
|
|
922
|
-
for (var g = [], B = 0; B <
|
|
923
|
-
var
|
|
838
|
+
for (var g = [], B = 0; B < a; B++) {
|
|
839
|
+
var E = i(n, A);
|
|
924
840
|
A += 2;
|
|
925
|
-
var
|
|
841
|
+
var h = i(n, A);
|
|
926
842
|
A += 2;
|
|
927
|
-
var l = r.readUint(
|
|
843
|
+
var l = r.readUint(n, A);
|
|
928
844
|
A += 4;
|
|
929
|
-
var c = "p" +
|
|
930
|
-
if (
|
|
931
|
-
|
|
845
|
+
var c = "p" + E + "e" + h, f = g.indexOf(l);
|
|
846
|
+
if (f == -1) {
|
|
847
|
+
f = t.tables.length;
|
|
932
848
|
var u = {};
|
|
933
849
|
g.push(l);
|
|
934
|
-
var
|
|
935
|
-
|
|
850
|
+
var C = u.format = i(n, l);
|
|
851
|
+
C == 4 ? u = s.parse4(n, l, u) : C == 12 && (u = s.parse12(n, l, u)), t.tables.push(u);
|
|
936
852
|
}
|
|
937
|
-
t.ids[c] != null && console.log("multiple tables for one platform+encoding: " + c), t.ids[c] =
|
|
853
|
+
t.ids[c] != null && console.log("multiple tables for one platform+encoding: " + c), t.ids[c] = f;
|
|
938
854
|
}
|
|
939
855
|
return t;
|
|
940
856
|
},
|
|
941
|
-
parse4: function(
|
|
857
|
+
parse4: function(n, A, e) {
|
|
942
858
|
var t = Q.B, r = t.readUshort, i = t.readUshorts, s = A;
|
|
943
859
|
A += 2;
|
|
944
|
-
var
|
|
945
|
-
A += 2, r(
|
|
946
|
-
var g = r(
|
|
860
|
+
var a = r(n, A);
|
|
861
|
+
A += 2, r(n, A), A += 2;
|
|
862
|
+
var g = r(n, A);
|
|
947
863
|
A += 2;
|
|
948
864
|
var B = g >>> 1;
|
|
949
|
-
e.searchRange = r(
|
|
950
|
-
for (var
|
|
951
|
-
e.idDelta.push(t.readShort(
|
|
952
|
-
return e.idRangeOffset = i(
|
|
865
|
+
e.searchRange = r(n, A), A += 2, e.entrySelector = r(n, A), A += 2, e.rangeShift = r(n, A), A += 2, e.endCount = i(n, A, B), A += B * 2, A += 2, e.startCount = i(n, A, B), A += B * 2, e.idDelta = [];
|
|
866
|
+
for (var E = 0; E < B; E++)
|
|
867
|
+
e.idDelta.push(t.readShort(n, A)), A += 2;
|
|
868
|
+
return e.idRangeOffset = i(n, A, B), A += B * 2, e.glyphIdArray = i(n, A, s + a - A >> 1), e;
|
|
953
869
|
},
|
|
954
|
-
parse12: function(
|
|
870
|
+
parse12: function(n, A, e) {
|
|
955
871
|
var t = Q.B, r = t.readUint;
|
|
956
|
-
A += 4, r(
|
|
957
|
-
var i = r(
|
|
872
|
+
A += 4, r(n, A), A += 4, r(n, A), A += 4;
|
|
873
|
+
var i = r(n, A) * 3;
|
|
958
874
|
A += 4;
|
|
959
|
-
for (var s = e.groups = new Uint32Array(i),
|
|
960
|
-
s[
|
|
875
|
+
for (var s = e.groups = new Uint32Array(i), a = 0; a < i; a += 3)
|
|
876
|
+
s[a] = r(n, A + (a << 2)), s[a + 1] = r(n, A + (a << 2) + 4), s[a + 2] = r(n, A + (a << 2) + 8);
|
|
961
877
|
return e;
|
|
962
878
|
}
|
|
963
879
|
};
|
|
964
880
|
Q.T.head = {
|
|
965
|
-
parseTab: function(
|
|
881
|
+
parseTab: function(n, A, e) {
|
|
966
882
|
var t = Q.B, r = {};
|
|
967
|
-
return A += 18, r.unitsPerEm = t.readUshort(
|
|
883
|
+
return A += 18, r.unitsPerEm = t.readUshort(n, A), A += 2, A += 16, r.xMin = t.readShort(n, A), A += 2, r.yMin = t.readShort(n, A), A += 2, r.xMax = t.readShort(n, A), A += 2, r.yMax = t.readShort(n, A), A += 2, A += 6, r.indexToLocFormat = t.readShort(n, A), r;
|
|
968
884
|
}
|
|
969
885
|
};
|
|
970
886
|
Q.T.hhea = {
|
|
971
|
-
parseTab: function(
|
|
887
|
+
parseTab: function(n, A, e) {
|
|
972
888
|
var t = Q.B, r = {};
|
|
973
889
|
A += 4;
|
|
974
890
|
for (var i = [
|
|
@@ -989,84 +905,84 @@ Q.T.hhea = {
|
|
|
989
905
|
"metricDataFormat",
|
|
990
906
|
"numberOfHMetrics"
|
|
991
907
|
], s = 0; s < i.length; s++) {
|
|
992
|
-
var
|
|
993
|
-
r[
|
|
908
|
+
var a = i[s], g = a == "advanceWidthMax" || a == "numberOfHMetrics" ? t.readUshort : t.readShort;
|
|
909
|
+
r[a] = g(n, A + s * 2);
|
|
994
910
|
}
|
|
995
911
|
return r;
|
|
996
912
|
}
|
|
997
913
|
};
|
|
998
914
|
Q.T.hmtx = {
|
|
999
|
-
parseTab: function(
|
|
1000
|
-
for (var r = Q.B, i = [], s = [],
|
|
1001
|
-
B = r.readUshort(
|
|
1002
|
-
for (;
|
|
1003
|
-
i.push(B), s.push(
|
|
915
|
+
parseTab: function(n, A, e, t) {
|
|
916
|
+
for (var r = Q.B, i = [], s = [], a = t.maxp.numGlyphs, g = t.hhea.numberOfHMetrics, B = 0, E = 0, h = 0; h < g; )
|
|
917
|
+
B = r.readUshort(n, A + (h << 2)), E = r.readShort(n, A + (h << 2) + 2), i.push(B), s.push(E), h++;
|
|
918
|
+
for (; h < a; )
|
|
919
|
+
i.push(B), s.push(E), h++;
|
|
1004
920
|
return { aWidth: i, lsBearing: s };
|
|
1005
921
|
}
|
|
1006
922
|
};
|
|
1007
923
|
Q.T.maxp = {
|
|
1008
|
-
parseTab: function(
|
|
924
|
+
parseTab: function(n, A, e) {
|
|
1009
925
|
var t = Q.B, r = t.readUshort, i = {};
|
|
1010
|
-
return t.readUint(
|
|
926
|
+
return t.readUint(n, A), A += 4, i.numGlyphs = r(n, A), A += 2, i;
|
|
1011
927
|
}
|
|
1012
928
|
};
|
|
1013
929
|
Q.T.loca = {
|
|
1014
|
-
parseTab: function(
|
|
1015
|
-
var r = Q.B, i = [], s = t.head.indexToLocFormat,
|
|
1016
|
-
if (s == 0) for (var g = 0; g <
|
|
1017
|
-
if (s == 1) for (var g = 0; g <
|
|
930
|
+
parseTab: function(n, A, e, t) {
|
|
931
|
+
var r = Q.B, i = [], s = t.head.indexToLocFormat, a = t.maxp.numGlyphs + 1;
|
|
932
|
+
if (s == 0) for (var g = 0; g < a; g++) i.push(r.readUshort(n, A + (g << 1)) << 1);
|
|
933
|
+
if (s == 1) for (var g = 0; g < a; g++) i.push(r.readUint(n, A + (g << 2)));
|
|
1018
934
|
return i;
|
|
1019
935
|
}
|
|
1020
936
|
};
|
|
1021
937
|
Q.T.glyf = {
|
|
1022
|
-
parseTab: function(
|
|
938
|
+
parseTab: function(n, A, e, t) {
|
|
1023
939
|
for (var r = [], i = t.maxp.numGlyphs, s = 0; s < i; s++) r.push(null);
|
|
1024
940
|
return r;
|
|
1025
941
|
},
|
|
1026
|
-
_parseGlyf: function(
|
|
1027
|
-
var e = Q.B, t =
|
|
942
|
+
_parseGlyf: function(n, A) {
|
|
943
|
+
var e = Q.B, t = n._data, r = n.loca;
|
|
1028
944
|
if (r[A] == r[A + 1]) return null;
|
|
1029
|
-
var i = Q.findTable(t, "glyf",
|
|
945
|
+
var i = Q.findTable(t, "glyf", n._offset)[0] + r[A], s = {};
|
|
1030
946
|
if (s.noc = e.readShort(t, i), i += 2, s.xMin = e.readShort(t, i), i += 2, s.yMin = e.readShort(t, i), i += 2, s.xMax = e.readShort(t, i), i += 2, s.yMax = e.readShort(t, i), i += 2, s.xMin >= s.xMax || s.yMin >= s.yMax) return null;
|
|
1031
947
|
if (s.noc > 0) {
|
|
1032
948
|
s.endPts = [];
|
|
1033
|
-
for (var
|
|
949
|
+
for (var a = 0; a < s.noc; a++)
|
|
1034
950
|
s.endPts.push(e.readUshort(t, i)), i += 2;
|
|
1035
951
|
var g = e.readUshort(t, i);
|
|
1036
952
|
if (i += 2, t.length - i < g) return null;
|
|
1037
953
|
i += g;
|
|
1038
954
|
var B = s.endPts[s.noc - 1] + 1;
|
|
1039
955
|
s.flags = [];
|
|
1040
|
-
for (var
|
|
1041
|
-
var
|
|
1042
|
-
if (i++, s.flags.push(
|
|
1043
|
-
var
|
|
956
|
+
for (var a = 0; a < B; a++) {
|
|
957
|
+
var E = t[i];
|
|
958
|
+
if (i++, s.flags.push(E), E & 8) {
|
|
959
|
+
var h = t[i];
|
|
1044
960
|
i++;
|
|
1045
|
-
for (var l = 0; l <
|
|
1046
|
-
s.flags.push(
|
|
961
|
+
for (var l = 0; l < h; l++)
|
|
962
|
+
s.flags.push(E), a++;
|
|
1047
963
|
}
|
|
1048
964
|
}
|
|
1049
965
|
s.xs = [];
|
|
1050
|
-
for (var
|
|
1051
|
-
var c = (s.flags[
|
|
1052
|
-
c ? (s.xs.push(
|
|
966
|
+
for (var a = 0; a < B; a++) {
|
|
967
|
+
var c = (s.flags[a] & 2) != 0, f = (s.flags[a] & 16) != 0;
|
|
968
|
+
c ? (s.xs.push(f ? t[i] : -t[i]), i++) : f ? s.xs.push(0) : (s.xs.push(e.readShort(t, i)), i += 2);
|
|
1053
969
|
}
|
|
1054
970
|
s.ys = [];
|
|
1055
|
-
for (var
|
|
1056
|
-
var c = (s.flags[
|
|
1057
|
-
c ? (s.ys.push(
|
|
971
|
+
for (var a = 0; a < B; a++) {
|
|
972
|
+
var c = (s.flags[a] & 4) != 0, f = (s.flags[a] & 32) != 0;
|
|
973
|
+
c ? (s.ys.push(f ? t[i] : -t[i]), i++) : f ? s.ys.push(0) : (s.ys.push(e.readShort(t, i)), i += 2);
|
|
1058
974
|
}
|
|
1059
|
-
for (var u = 0,
|
|
1060
|
-
u += s.xs[
|
|
975
|
+
for (var u = 0, C = 0, a = 0; a < B; a++)
|
|
976
|
+
u += s.xs[a], C += s.ys[a], s.xs[a] = u, s.ys[a] = C;
|
|
1061
977
|
} else
|
|
1062
978
|
s.parts = [];
|
|
1063
979
|
return s;
|
|
1064
980
|
}
|
|
1065
981
|
};
|
|
1066
982
|
typeof module < "u" && module.exports ? module.exports = Q : typeof window < "u" && (window.Typr = Q);
|
|
1067
|
-
const QA = `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
|
|
983
|
+
const oA = `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
|
|
1068
984
|
`;
|
|
1069
|
-
class
|
|
985
|
+
class nA {
|
|
1070
986
|
/**
|
|
1071
987
|
* Extracts all available characters from a font's cmap tables.
|
|
1072
988
|
* @param font The parsed font object from Typr
|
|
@@ -1117,9 +1033,9 @@ class cA {
|
|
|
1117
1033
|
return e;
|
|
1118
1034
|
for (let t = 0; t < A.groups.length; t += 3) {
|
|
1119
1035
|
const r = A.groups[t], i = A.groups[t + 1], s = A.groups[t + 2];
|
|
1120
|
-
for (let
|
|
1121
|
-
if (s + (
|
|
1122
|
-
const B = String.fromCodePoint(
|
|
1036
|
+
for (let a = r; a <= i; a++)
|
|
1037
|
+
if (s + (a - r) > 0) {
|
|
1038
|
+
const B = String.fromCodePoint(a);
|
|
1123
1039
|
e.push(B);
|
|
1124
1040
|
}
|
|
1125
1041
|
}
|
|
@@ -1163,7 +1079,7 @@ class cA {
|
|
|
1163
1079
|
return !(e >= 0 && e <= 31 && e !== 9 && e !== 10 && e !== 13 || e >= 127 && e <= 159);
|
|
1164
1080
|
}
|
|
1165
1081
|
}
|
|
1166
|
-
class
|
|
1082
|
+
class gA {
|
|
1167
1083
|
/**
|
|
1168
1084
|
* Creates a new TextureAtlasCreation instance.
|
|
1169
1085
|
* @param renderer The WebGL renderer instance
|
|
@@ -1183,13 +1099,13 @@ class uA {
|
|
|
1183
1099
|
* @returns Object containing framebuffer, columns, and rows
|
|
1184
1100
|
*/
|
|
1185
1101
|
createTextureAtlas(A, e, t, r) {
|
|
1186
|
-
const i = A.length, s = Math.ceil(Math.sqrt(i)),
|
|
1102
|
+
const i = A.length, s = Math.ceil(Math.sqrt(i)), a = Math.ceil(i / s), g = e.width * s, B = e.height * a;
|
|
1187
1103
|
this._setupCanvas(g, B, t, r), this._renderCharactersToCanvas(A, e, s, t), this._applyBlackWhiteThreshold();
|
|
1188
|
-
const
|
|
1189
|
-
return
|
|
1190
|
-
framebuffer:
|
|
1104
|
+
const E = this._renderer.createFramebuffer(g, B, { filter: "nearest" });
|
|
1105
|
+
return E.update(this._textureCanvas), {
|
|
1106
|
+
framebuffer: E,
|
|
1191
1107
|
columns: s,
|
|
1192
|
-
rows:
|
|
1108
|
+
rows: a
|
|
1193
1109
|
};
|
|
1194
1110
|
}
|
|
1195
1111
|
/**
|
|
@@ -1213,8 +1129,8 @@ class uA {
|
|
|
1213
1129
|
*/
|
|
1214
1130
|
_renderCharactersToCanvas(A, e, t, r) {
|
|
1215
1131
|
for (let i = 0; i < A.length; i++) {
|
|
1216
|
-
const s = i % t,
|
|
1217
|
-
this._textureContext.fillText(A[i].character,
|
|
1132
|
+
const s = i % t, a = Math.floor(i / t), g = s * e.width + e.width * 0.5, B = a * e.height + e.height * 0.5, E = Math.round(g - e.width * 0.5), h = Math.round(B - r * 0.5);
|
|
1133
|
+
this._textureContext.fillText(A[i].character, E, h);
|
|
1218
1134
|
}
|
|
1219
1135
|
}
|
|
1220
1136
|
/**
|
|
@@ -1226,13 +1142,13 @@ class uA {
|
|
|
1226
1142
|
_applyBlackWhiteThreshold(A = 128) {
|
|
1227
1143
|
const e = this._textureContext.getImageData(0, 0, this._textureCanvas.width, this._textureCanvas.height), t = e.data;
|
|
1228
1144
|
for (let r = 0; r < t.length; r += 4) {
|
|
1229
|
-
const i = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2], s = A + 32,
|
|
1230
|
-
t[r] =
|
|
1145
|
+
const i = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2], s = A + 32, a = i > s ? 255 : 0;
|
|
1146
|
+
t[r] = a, t[r + 1] = a, t[r + 2] = a;
|
|
1231
1147
|
}
|
|
1232
1148
|
this._textureContext.putImageData(e, 0, 0);
|
|
1233
1149
|
}
|
|
1234
1150
|
}
|
|
1235
|
-
class
|
|
1151
|
+
class BA {
|
|
1236
1152
|
/**
|
|
1237
1153
|
* Creates a new MetricsCalculation instance.
|
|
1238
1154
|
*/
|
|
@@ -1253,7 +1169,7 @@ class dA {
|
|
|
1253
1169
|
this._tempContext.font = `${e}px ${t}`;
|
|
1254
1170
|
let r = 0, i = 0;
|
|
1255
1171
|
for (const s of A) {
|
|
1256
|
-
const
|
|
1172
|
+
const a = this._tempContext.measureText(s), g = a.width, B = a.actualBoundingBoxAscent + a.actualBoundingBoxDescent;
|
|
1257
1173
|
g > 0 && (r = Math.max(r, g), i = Math.max(i, B));
|
|
1258
1174
|
}
|
|
1259
1175
|
return {
|
|
@@ -1262,7 +1178,7 @@ class dA {
|
|
|
1262
1178
|
};
|
|
1263
1179
|
}
|
|
1264
1180
|
}
|
|
1265
|
-
class
|
|
1181
|
+
class EA {
|
|
1266
1182
|
/**
|
|
1267
1183
|
* Creates TextmodeCharacter objects with unique color assignments.
|
|
1268
1184
|
* @param characters Array of character strings
|
|
@@ -1272,16 +1188,16 @@ class fA {
|
|
|
1272
1188
|
createCharacterObjects(A, e) {
|
|
1273
1189
|
return A.map((t, r) => {
|
|
1274
1190
|
const i = t.codePointAt(0) || 0, s = this._generateCharacterColor(r);
|
|
1275
|
-
let
|
|
1191
|
+
let a = 0;
|
|
1276
1192
|
if (e.hmtx && e.hmtx.aWidth) {
|
|
1277
1193
|
const g = this._getGlyphIndex(e, i);
|
|
1278
|
-
g > 0 && e.hmtx.aWidth[g] !== void 0 && (
|
|
1194
|
+
g > 0 && e.hmtx.aWidth[g] !== void 0 && (a = e.hmtx.aWidth[g]);
|
|
1279
1195
|
}
|
|
1280
1196
|
return {
|
|
1281
1197
|
character: t,
|
|
1282
1198
|
unicode: i,
|
|
1283
1199
|
color: s,
|
|
1284
|
-
advanceWidth:
|
|
1200
|
+
advanceWidth: a
|
|
1285
1201
|
};
|
|
1286
1202
|
});
|
|
1287
1203
|
}
|
|
@@ -1304,9 +1220,9 @@ class fA {
|
|
|
1304
1220
|
{
|
|
1305
1221
|
const s = r.idRangeOffset[i] / 2 + (e - r.startCount[i]) - (r.startCount.length - i);
|
|
1306
1222
|
if (s >= 0 && s < r.glyphIdArray.length) {
|
|
1307
|
-
const
|
|
1308
|
-
if (
|
|
1309
|
-
return
|
|
1223
|
+
const a = r.glyphIdArray[s];
|
|
1224
|
+
if (a !== 0)
|
|
1225
|
+
return a + r.idDelta[i] & 65535;
|
|
1310
1226
|
}
|
|
1311
1227
|
}
|
|
1312
1228
|
}
|
|
@@ -1329,7 +1245,7 @@ class fA {
|
|
|
1329
1245
|
* @returns RGB color as a tuple [r, g, b], or [0, 0, 0] if not found
|
|
1330
1246
|
*/
|
|
1331
1247
|
getCharacterColor(A, e) {
|
|
1332
|
-
if (!
|
|
1248
|
+
if (!d.validate(
|
|
1333
1249
|
typeof A == "string" && A.length === 1,
|
|
1334
1250
|
"Character must be a single character string.",
|
|
1335
1251
|
{ method: "getCharacterColor", providedValue: A }
|
|
@@ -1345,14 +1261,14 @@ class fA {
|
|
|
1345
1261
|
* @returns Array of RGB colors for each character
|
|
1346
1262
|
*/
|
|
1347
1263
|
getCharacterColors(A, e) {
|
|
1348
|
-
return
|
|
1264
|
+
return d.validate(
|
|
1349
1265
|
typeof A == "string" && A.length > 0,
|
|
1350
1266
|
"Characters must be a string with at least one character.",
|
|
1351
1267
|
{ method: "getCharacterColors", providedValue: A }
|
|
1352
1268
|
) ? A.split("").map((t) => this.getCharacterColor(t, e) || [0, 0, 0]) : [[0, 0, 0]];
|
|
1353
1269
|
}
|
|
1354
1270
|
}
|
|
1355
|
-
class
|
|
1271
|
+
class hA {
|
|
1356
1272
|
/**
|
|
1357
1273
|
* Creates a new TextmodeFont instance.
|
|
1358
1274
|
* @param renderer Renderer instance for texture creation
|
|
@@ -1374,7 +1290,7 @@ class CA {
|
|
|
1374
1290
|
o(this, "_textureAtlas");
|
|
1375
1291
|
o(this, "_metricsCalculator");
|
|
1376
1292
|
o(this, "_characterColorMapper");
|
|
1377
|
-
this._fontSize = e, this._characterExtractor = new
|
|
1293
|
+
this._fontSize = e, this._characterExtractor = new nA(), this._textureAtlas = new gA(A), this._metricsCalculator = new BA(), this._characterColorMapper = new EA();
|
|
1378
1294
|
}
|
|
1379
1295
|
/**
|
|
1380
1296
|
* Initializes the font manager by loading the font and creating the texture atlas.
|
|
@@ -1387,10 +1303,10 @@ class CA {
|
|
|
1387
1303
|
if (A) {
|
|
1388
1304
|
const t = await fetch(A);
|
|
1389
1305
|
if (!t.ok)
|
|
1390
|
-
throw new
|
|
1306
|
+
throw new m(`Failed to load font file: ${t.status} ${t.statusText}`);
|
|
1391
1307
|
e = await t.arrayBuffer();
|
|
1392
1308
|
} else
|
|
1393
|
-
e = await (await fetch(
|
|
1309
|
+
e = await (await fetch(oA)).arrayBuffer();
|
|
1394
1310
|
await this._loadFontFace(e), this._font = Q.parse(e)[0], await this._initializeFont();
|
|
1395
1311
|
}
|
|
1396
1312
|
/**
|
|
@@ -1423,7 +1339,7 @@ class CA {
|
|
|
1423
1339
|
try {
|
|
1424
1340
|
const e = await fetch(A);
|
|
1425
1341
|
if (!e.ok)
|
|
1426
|
-
throw new
|
|
1342
|
+
throw new m(`Failed to load font file: ${e.status} ${e.statusText}`);
|
|
1427
1343
|
const t = await e.arrayBuffer();
|
|
1428
1344
|
await this._loadFontFace(t);
|
|
1429
1345
|
const r = Q.parse(t);
|
|
@@ -1431,7 +1347,7 @@ class CA {
|
|
|
1431
1347
|
throw new Error("Failed to parse font file");
|
|
1432
1348
|
this._font = r[0], await this._initializeFont();
|
|
1433
1349
|
} catch (e) {
|
|
1434
|
-
throw new
|
|
1350
|
+
throw new m(`Failed to load font: ${e instanceof Error ? e.message : "Unknown error"}`, e);
|
|
1435
1351
|
}
|
|
1436
1352
|
}
|
|
1437
1353
|
/**
|
|
@@ -1528,7 +1444,7 @@ class CA {
|
|
|
1528
1444
|
return this._font;
|
|
1529
1445
|
}
|
|
1530
1446
|
}
|
|
1531
|
-
class
|
|
1447
|
+
class lA {
|
|
1532
1448
|
/**
|
|
1533
1449
|
* Create a new grid instance.
|
|
1534
1450
|
* @param canvas The canvas element used to determine the grid dimensions.
|
|
@@ -1565,9 +1481,8 @@ class mA {
|
|
|
1565
1481
|
*/
|
|
1566
1482
|
reset() {
|
|
1567
1483
|
if (!this._fixedDimensions) {
|
|
1568
|
-
const A = this._canvas.
|
|
1569
|
-
|
|
1570
|
-
[this._cols, this._rows] = [Math.floor(e / this._cellWidth), Math.floor(t / this._cellHeight)];
|
|
1484
|
+
const A = this._canvas.width, e = this._canvas.height;
|
|
1485
|
+
[this._cols, this._rows] = [Math.floor(A / this._cellWidth), Math.floor(e / this._cellHeight)];
|
|
1571
1486
|
}
|
|
1572
1487
|
this._resizeGrid();
|
|
1573
1488
|
}
|
|
@@ -1575,9 +1490,8 @@ class mA {
|
|
|
1575
1490
|
* Reset the total grid width & height, and the offset to the outer canvas.
|
|
1576
1491
|
*/
|
|
1577
1492
|
_resizeGrid() {
|
|
1578
|
-
const A = this._canvas.
|
|
1579
|
-
|
|
1580
|
-
this._width = this._cols * this._cellWidth, this._height = this._rows * this._cellHeight, this._offsetX = Math.floor((e - this._width) / 2), this._offsetY = Math.floor((t - this._height) / 2);
|
|
1493
|
+
const A = this._canvas.width, e = this._canvas.height;
|
|
1494
|
+
this._width = this._cols * this._cellWidth, this._height = this._rows * this._cellHeight, this._offsetX = Math.floor((A - this._width) / 2), this._offsetY = Math.floor((e - this._height) / 2);
|
|
1581
1495
|
}
|
|
1582
1496
|
/**
|
|
1583
1497
|
* Re-assign the grid cell dimensions and `reset()` the grid.
|
|
@@ -1665,7 +1579,7 @@ class mA {
|
|
|
1665
1579
|
return this._offsetY;
|
|
1666
1580
|
}
|
|
1667
1581
|
}
|
|
1668
|
-
class
|
|
1582
|
+
class QA {
|
|
1669
1583
|
constructor(A, e = !1, t = {}) {
|
|
1670
1584
|
o(this, "_canvas");
|
|
1671
1585
|
o(this, "captureSource");
|
|
@@ -1681,12 +1595,12 @@ class DA {
|
|
|
1681
1595
|
t.width = A || 800, t.height = e || 600, document.body.appendChild(t);
|
|
1682
1596
|
else {
|
|
1683
1597
|
const i = this.captureSource.getBoundingClientRect();
|
|
1684
|
-
let s = Math.round(i.width),
|
|
1598
|
+
let s = Math.round(i.width), a = Math.round(i.height);
|
|
1685
1599
|
if (this.captureSource instanceof HTMLVideoElement) {
|
|
1686
|
-
const
|
|
1687
|
-
(s === 0 ||
|
|
1600
|
+
const E = this.captureSource;
|
|
1601
|
+
(s === 0 || a === 0) && E.videoWidth > 0 && E.videoHeight > 0 && (s = E.videoWidth, a = E.videoHeight);
|
|
1688
1602
|
}
|
|
1689
|
-
t.width = s, t.height =
|
|
1603
|
+
t.width = s, t.height = a, t.style.position = "absolute", t.style.pointerEvents = "none";
|
|
1690
1604
|
const g = window.getComputedStyle(this.captureSource);
|
|
1691
1605
|
let B = parseInt(g.zIndex || "0", 10);
|
|
1692
1606
|
isNaN(B) && (B = 0), t.style.zIndex = (B + 1).toString(), this.positionOverlayCanvas(t), (r = this.captureSource.parentNode) == null || r.insertBefore(t, this.captureSource.nextSibling);
|
|
@@ -1729,22 +1643,14 @@ class DA {
|
|
|
1729
1643
|
powerPreference: "high-performance"
|
|
1730
1644
|
}, e = this._canvas.getContext("webgl2", A) || this._canvas.getContext("webgl", A);
|
|
1731
1645
|
if (!e)
|
|
1732
|
-
throw new
|
|
1646
|
+
throw new m("WebGL context could not be created. Ensure your browser supports WebGL.");
|
|
1733
1647
|
return e;
|
|
1734
1648
|
}
|
|
1735
1649
|
/**
|
|
1736
1650
|
* Get the effective rendering dimensions accounting for CSS transforms
|
|
1737
1651
|
*/
|
|
1738
1652
|
getEffectiveRenderingDimensions() {
|
|
1739
|
-
|
|
1740
|
-
return { width: 0, height: 0 };
|
|
1741
|
-
const A = this._canvas.getBoundingClientRect(), e = Math.round(A.width), t = Math.round(A.height);
|
|
1742
|
-
if (this._isStandalone) {
|
|
1743
|
-
const r = this._canvas.width, i = this._canvas.height;
|
|
1744
|
-
if (e !== r || t !== i)
|
|
1745
|
-
return { width: e, height: t };
|
|
1746
|
-
}
|
|
1747
|
-
return { width: this._canvas.width, height: this._canvas.height };
|
|
1653
|
+
return this._canvas ? { width: this._canvas.width, height: this._canvas.height } : { width: 0, height: 0 };
|
|
1748
1654
|
}
|
|
1749
1655
|
/**
|
|
1750
1656
|
* Check if the canvas is affected by CSS transforms
|
|
@@ -1790,7 +1696,7 @@ class DA {
|
|
|
1790
1696
|
return this._canvas.height;
|
|
1791
1697
|
}
|
|
1792
1698
|
}
|
|
1793
|
-
class
|
|
1699
|
+
class T {
|
|
1794
1700
|
/**
|
|
1795
1701
|
* Creates a new TextmodeConverter instance.
|
|
1796
1702
|
* @param renderer Renderer instance for texture creation
|
|
@@ -1869,7 +1775,7 @@ class x {
|
|
|
1869
1775
|
return this._options;
|
|
1870
1776
|
}
|
|
1871
1777
|
}
|
|
1872
|
-
class
|
|
1778
|
+
class cA {
|
|
1873
1779
|
/**
|
|
1874
1780
|
* Create a new color palette instance.
|
|
1875
1781
|
* @param renderer The renderer instance.
|
|
@@ -1924,18 +1830,18 @@ class pA {
|
|
|
1924
1830
|
return this._framebuffer.texture;
|
|
1925
1831
|
}
|
|
1926
1832
|
}
|
|
1927
|
-
class z extends
|
|
1833
|
+
class z extends T {
|
|
1928
1834
|
constructor(e, t, r, i = {}) {
|
|
1929
1835
|
super(e, t, r, i);
|
|
1930
1836
|
o(this, "palette");
|
|
1931
|
-
this.palette = new
|
|
1837
|
+
this.palette = new cA(this.renderer, this.fontManager.getCharacterColors(" .:-=+*%@#"));
|
|
1932
1838
|
}
|
|
1933
1839
|
/**
|
|
1934
1840
|
* Sets the characters used for mapping.
|
|
1935
1841
|
* @param characters The characters to use for mapping, usually ordered from darkest to brightest.
|
|
1936
1842
|
*/
|
|
1937
1843
|
characters(e) {
|
|
1938
|
-
|
|
1844
|
+
d.validate(
|
|
1939
1845
|
this.fontManager.hasAllCharacters(e),
|
|
1940
1846
|
"One or more characters do not exist in the current font.",
|
|
1941
1847
|
{ method: "characters", providedValue: e }
|
|
@@ -1950,25 +1856,25 @@ class z extends x {
|
|
|
1950
1856
|
* @param a Alpha component (0-255).
|
|
1951
1857
|
*/
|
|
1952
1858
|
characterColor(e, t, r, i = 255) {
|
|
1953
|
-
let s,
|
|
1859
|
+
let s, a, g, B;
|
|
1954
1860
|
if (typeof e == "string") {
|
|
1955
|
-
const
|
|
1956
|
-
if (!
|
|
1957
|
-
|
|
1861
|
+
const E = this.parseHexColor(e);
|
|
1862
|
+
if (!E) {
|
|
1863
|
+
d.validate(
|
|
1958
1864
|
!1,
|
|
1959
1865
|
"Invalid hex color format. Use '#FF0000', '#F00', 'FF0000', or 'F00'.",
|
|
1960
1866
|
{ method: "characterColor", providedValue: e }
|
|
1961
1867
|
);
|
|
1962
1868
|
return;
|
|
1963
1869
|
}
|
|
1964
|
-
[s,
|
|
1965
|
-
} else if (s = e,
|
|
1966
|
-
[s,
|
|
1870
|
+
[s, a, g, B] = E;
|
|
1871
|
+
} else if (s = e, a = t !== void 0 ? t : e, g = r !== void 0 ? r : e, B = i, !d.validate(
|
|
1872
|
+
[s, a, g, B].every((E) => E >= 0 && E <= 255),
|
|
1967
1873
|
"Character color values must be between 0 and 255",
|
|
1968
|
-
{ method: "characterColor", providedValues: { r: s, g:
|
|
1874
|
+
{ method: "characterColor", providedValues: { r: s, g: a, b: g, a: B } }
|
|
1969
1875
|
))
|
|
1970
1876
|
return;
|
|
1971
|
-
this._options.characterColor = [s / 255,
|
|
1877
|
+
this._options.characterColor = [s / 255, a / 255, g / 255, B / 255];
|
|
1972
1878
|
}
|
|
1973
1879
|
/**
|
|
1974
1880
|
* Sets the character color mode.
|
|
@@ -1977,7 +1883,7 @@ class z extends x {
|
|
|
1977
1883
|
* @param mode The color mode to use for characters.
|
|
1978
1884
|
*/
|
|
1979
1885
|
characterColorMode(e) {
|
|
1980
|
-
|
|
1886
|
+
d.validate(
|
|
1981
1887
|
["sampled", "fixed"].includes(e),
|
|
1982
1888
|
"Invalid character color mode. Must be 'sampled' or 'fixed'.",
|
|
1983
1889
|
{ method: "characterColorMode", providedValue: e }
|
|
@@ -1992,25 +1898,25 @@ class z extends x {
|
|
|
1992
1898
|
* @param a Alpha component (0-255).
|
|
1993
1899
|
*/
|
|
1994
1900
|
cellColor(e, t, r, i = 255) {
|
|
1995
|
-
let s,
|
|
1901
|
+
let s, a, g, B;
|
|
1996
1902
|
if (typeof e == "string") {
|
|
1997
|
-
const
|
|
1998
|
-
if (!
|
|
1999
|
-
|
|
1903
|
+
const E = this.parseHexColor(e);
|
|
1904
|
+
if (!E) {
|
|
1905
|
+
d.validate(
|
|
2000
1906
|
!1,
|
|
2001
1907
|
"Invalid hex color format. Use '#FF0000', '#F00', 'FF0000', or 'F00'.",
|
|
2002
1908
|
{ method: "cellColor", providedValue: e }
|
|
2003
1909
|
);
|
|
2004
1910
|
return;
|
|
2005
1911
|
}
|
|
2006
|
-
[s,
|
|
2007
|
-
} else if (s = e,
|
|
2008
|
-
[s,
|
|
1912
|
+
[s, a, g, B] = E;
|
|
1913
|
+
} else if (s = e, a = t !== void 0 ? t : e, g = r !== void 0 ? r : e, B = i, !d.validate(
|
|
1914
|
+
[s, a, g, B].every((E) => E >= 0 && E <= 255),
|
|
2009
1915
|
"Cell color values must be between 0 and 255",
|
|
2010
|
-
{ method: "cellColor", providedValues: { r: s, g:
|
|
1916
|
+
{ method: "cellColor", providedValues: { r: s, g: a, b: g, a: B } }
|
|
2011
1917
|
))
|
|
2012
1918
|
return;
|
|
2013
|
-
this._options.cellColor = [s / 255,
|
|
1919
|
+
this._options.cellColor = [s / 255, a / 255, g / 255, B / 255];
|
|
2014
1920
|
}
|
|
2015
1921
|
/**
|
|
2016
1922
|
* Sets the cell color mode.
|
|
@@ -2019,7 +1925,7 @@ class z extends x {
|
|
|
2019
1925
|
* @param mode The color mode to use for background cells.
|
|
2020
1926
|
*/
|
|
2021
1927
|
cellColorMode(e) {
|
|
2022
|
-
|
|
1928
|
+
d.validate(
|
|
2023
1929
|
["sampled", "fixed"].includes(e),
|
|
2024
1930
|
"Invalid cell color mode. Must be 'sampled' or 'fixed'.",
|
|
2025
1931
|
{ method: "cellColorMode", providedValue: e }
|
|
@@ -2030,7 +1936,7 @@ class z extends x {
|
|
|
2030
1936
|
* @param invert If `true`, the character color becomes the cell color and vice versa.
|
|
2031
1937
|
*/
|
|
2032
1938
|
invert(e) {
|
|
2033
|
-
|
|
1939
|
+
d.validate(
|
|
2034
1940
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
2035
1941
|
"Invert must be a boolean value or an integer (0 for false, any other number for true).",
|
|
2036
1942
|
{ method: "invert", providedValue: e }
|
|
@@ -2041,7 +1947,7 @@ class z extends x {
|
|
|
2041
1947
|
* @param angle The rotation angle in degrees.
|
|
2042
1948
|
*/
|
|
2043
1949
|
rotation(e) {
|
|
2044
|
-
if (!
|
|
1950
|
+
if (!d.validate(
|
|
2045
1951
|
typeof e == "number",
|
|
2046
1952
|
"Rotation angle must be a number.",
|
|
2047
1953
|
{ method: "rotation", providedValue: e }
|
|
@@ -2056,7 +1962,7 @@ class z extends x {
|
|
|
2056
1962
|
* @param flip If `true`, characters are flipped horizontally. If `false`, no flip is applied.
|
|
2057
1963
|
*/
|
|
2058
1964
|
flipHorizontally(e) {
|
|
2059
|
-
|
|
1965
|
+
d.validate(
|
|
2060
1966
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
2061
1967
|
"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",
|
|
2062
1968
|
{ method: "flipHorizontally", providedValue: e }
|
|
@@ -2067,7 +1973,7 @@ class z extends x {
|
|
|
2067
1973
|
* @param flip If `true`, characters are flipped vertically. If `false`, no flip is applied.
|
|
2068
1974
|
*/
|
|
2069
1975
|
flipVertically(e) {
|
|
2070
|
-
|
|
1976
|
+
d.validate(
|
|
2071
1977
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
2072
1978
|
"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",
|
|
2073
1979
|
{ method: "flipVertically", providedValue: e }
|
|
@@ -2086,8 +1992,8 @@ class z extends x {
|
|
|
2086
1992
|
return [t, r, i, 255];
|
|
2087
1993
|
}
|
|
2088
1994
|
}
|
|
2089
|
-
var
|
|
2090
|
-
const
|
|
1995
|
+
var uA = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;vec4 color=texture2D(u_sketchTexture,cellCenter);float brightness=dot(color.rgb,vec3(0.299,0.587,0.114));float brightnessValue=brightness*255.0;if(brightnessValue>=u_brightnessRange.x&&brightnessValue<=u_brightnessRange.y){gl_FragColor=color;}else{gl_FragColor=vec4(0.0);}}", dA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_fillColor;uniform bool u_useFixedColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){if(u_useFixedColor){gl_FragColor=u_fillColor;}else{gl_FragColor=sampleColor;}}else{gl_FragColor=vec4(0.0);}}", fA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform bool u_invert;uniform bool u_flipHorizontally;uniform bool u_flipVertically;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){float invertValue=u_invert ? 1.0 : 0.0;float flipHValue=u_flipHorizontally ? 1.0 : 0.0;float flipVValue=u_flipVertically ? 1.0 : 0.0;gl_FragColor=vec4(invertValue,flipHValue,flipVValue,1.0);}else{gl_FragColor=vec4(0.0);}}", CA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_rotationColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){gl_FragColor=u_rotationColor;}else{gl_FragColor=vec4(0.0);}}", mA = "precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_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;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,1.0);}";
|
|
1996
|
+
const DA = {
|
|
2091
1997
|
/** Enable/disable the renderer */
|
|
2092
1998
|
enabled: !0,
|
|
2093
1999
|
/** Characters used for brightness mapping (from darkest to brightest) */
|
|
@@ -2113,7 +2019,7 @@ const bA = {
|
|
|
2113
2019
|
/** Range of brightness values to map to ASCII characters */
|
|
2114
2020
|
brightnessRange: [0, 255]
|
|
2115
2021
|
};
|
|
2116
|
-
class
|
|
2022
|
+
class V extends z {
|
|
2117
2023
|
/**
|
|
2118
2024
|
* Creates a new TextmodeBrightnessConverter instance.
|
|
2119
2025
|
* @param renderer Renderer instance for texture creation
|
|
@@ -2122,14 +2028,14 @@ class k extends z {
|
|
|
2122
2028
|
* @ignore
|
|
2123
2029
|
*/
|
|
2124
2030
|
constructor(e, t, r) {
|
|
2125
|
-
super(e, t, r, { ...
|
|
2031
|
+
super(e, t, r, { ...DA });
|
|
2126
2032
|
o(this, "sampleShader");
|
|
2127
2033
|
o(this, "colorFillShader");
|
|
2128
2034
|
o(this, "charMappingShader");
|
|
2129
2035
|
o(this, "transformFillShader");
|
|
2130
2036
|
o(this, "rotationFillShader");
|
|
2131
2037
|
o(this, "sampleFramebuffer");
|
|
2132
|
-
this.sampleShader = new
|
|
2038
|
+
this.sampleShader = new _(e.context, w, uA), this.colorFillShader = new _(e.context, w, dA), this.transformFillShader = new _(e.context, w, fA), this.rotationFillShader = new _(e.context, w, CA), this.charMappingShader = new _(e.context, w, mA), this.sampleFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
2133
2039
|
}
|
|
2134
2040
|
convert(e) {
|
|
2135
2041
|
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture", e), this.renderer.setUniform("u_gridCellDimensions", [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.sampleFramebuffer.end(), this._primaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.characterColor), this.renderer.setUniform("u_useFixedColor", this._options.characterColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._primaryColorFramebuffer.end(), this._secondaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.cellColor), this.renderer.setUniform("u_useFixedColor", this._options.cellColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.transformFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_invert", this._options.invert), this.renderer.setUniform("u_flipHorizontally", this._options.flipHorizontally), this.renderer.setUniform("u_flipVertically", this._options.flipVertically), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._transformFramebuffer.end(), this._rotationFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.rotationFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_rotationColor", this._options.rotation), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), 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_brightnessRange", this._options.brightnessRange), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._characterFramebuffer.end();
|
|
@@ -2145,21 +2051,21 @@ class k extends z {
|
|
|
2145
2051
|
* @param range Array of two numbers `[min, max]`, where `min` is darkest and `max` is brightest.
|
|
2146
2052
|
*/
|
|
2147
2053
|
brightnessRange(e) {
|
|
2148
|
-
|
|
2054
|
+
d.validate(
|
|
2149
2055
|
Array.isArray(e) && e.length === 2 && e.every((t) => typeof t == "number" && t >= 0 && t <= 255),
|
|
2150
2056
|
"Brightness range must be an array of two numbers between 0 and 255.",
|
|
2151
2057
|
{ method: "brightnessRange", providedValue: e }
|
|
2152
2058
|
) && (this._options.brightnessRange = e);
|
|
2153
2059
|
}
|
|
2154
2060
|
}
|
|
2155
|
-
const
|
|
2061
|
+
const MA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
2156
2062
|
__proto__: null,
|
|
2157
|
-
TextmodeBrightnessConverter:
|
|
2158
|
-
TextmodeConverter:
|
|
2063
|
+
TextmodeBrightnessConverter: V,
|
|
2064
|
+
TextmodeConverter: T,
|
|
2159
2065
|
TextmodeFeatureConverter: z
|
|
2160
2066
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
2161
|
-
var
|
|
2162
|
-
class
|
|
2067
|
+
var pA = "precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 adjustedCoord=gl_FragCoord.xy/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,charIndexTexCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,charIndexTexCoord);vec4 transformColor=texture2D(u_transformTexture,charIndexTexCoord);bool isInverted=transformColor.r>0.5;bool flipHorizontal=transformColor.g>0.5;bool flipVertical=transformColor.b>0.5;vec4 encodedIndexVec=texture2D(u_asciiCharacterTexture,charIndexTexCoord);if(encodedIndexVec.a<0.01){gl_FragColor=(u_backgroundMode==0)? vec4(0.0):texture2D(u_captureTexture,gl_FragCoord.xy/u_captureDimensions);return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=int(mod(float(charIndex),u_charsetDimensions.x));int charRow=charIndex/int(u_charsetDimensions.x);float flippedRow=(u_charsetDimensions.y-1.0)-float(charRow);vec2 charCoord=vec2(float(charCol),flippedRow)/u_charsetDimensions;vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float scaledAngle=rotationColor.r*255.0+rotationColor.g;float rotationAngle=(scaledAngle*360.0/255.0)*0.017453292;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal)fractionalPart.x=-fractionalPart.x;if(flipVertical)fractionalPart.y=-fractionalPart.y;fractionalPart=rotate2D(rotationAngle)*fractionalPart+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 texCoord=charCoord+fractionalPart*cellSize;vec2 cellMax=charCoord+cellSize;if(any(lessThan(texCoord,charCoord))||any(greaterThan(texCoord,cellMax))){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);if(isInverted)charTexel.rgb=1.0-charTexel.rgb;gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}";
|
|
2068
|
+
class PA {
|
|
2163
2069
|
/**
|
|
2164
2070
|
* Creates an instance of TextmodeConversionPipeline.
|
|
2165
2071
|
* @param renderer The renderer to use for the pipeline.
|
|
@@ -2179,9 +2085,9 @@ class FA {
|
|
|
2179
2085
|
o(this, "_secondaryColorFramebuffer");
|
|
2180
2086
|
o(this, "_rotationFramebuffer");
|
|
2181
2087
|
o(this, "_transformFramebuffer");
|
|
2182
|
-
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(
|
|
2183
|
-
{ name: "brightness", converter: new
|
|
2184
|
-
{ name: "custom", converter: new
|
|
2088
|
+
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(w, pA), this.converters = [
|
|
2089
|
+
{ name: "brightness", converter: new V(A, e, t) },
|
|
2090
|
+
{ name: "custom", converter: new T(A, e, t) }
|
|
2185
2091
|
], this._characterFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._primaryColorFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._secondaryColorFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._rotationFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._transformFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._resultFramebuffer = this.renderer.createFramebuffer(this.grid.width, this.grid.height);
|
|
2186
2092
|
}
|
|
2187
2093
|
/**
|
|
@@ -2210,15 +2116,15 @@ class FA {
|
|
|
2210
2116
|
* @returns The requested `TextmodeConverter` instance.
|
|
2211
2117
|
*/
|
|
2212
2118
|
get(A) {
|
|
2213
|
-
if (!
|
|
2119
|
+
if (!d.validate(
|
|
2214
2120
|
typeof A == "string" && A.length > 0,
|
|
2215
2121
|
"Converter name must be a non-empty string.",
|
|
2216
2122
|
{ method: "converter", providedValue: A }
|
|
2217
2123
|
))
|
|
2218
2124
|
return;
|
|
2219
2125
|
const e = this.converters.find((r) => r.name === A), t = e == null ? void 0 : e.converter;
|
|
2220
|
-
if (
|
|
2221
|
-
t instanceof
|
|
2126
|
+
if (d.validate(
|
|
2127
|
+
t instanceof T,
|
|
2222
2128
|
`Converter "${A}" is not a valid TextmodeConverter.`,
|
|
2223
2129
|
{ method: "converter", providedValue: A, converterInstance: t }
|
|
2224
2130
|
))
|
|
@@ -2231,33 +2137,33 @@ class FA {
|
|
|
2231
2137
|
* @returns The newly created {@link TextmodeConverter} instance or `void` if the addition failed.
|
|
2232
2138
|
*/
|
|
2233
2139
|
add(A, e) {
|
|
2234
|
-
if (!
|
|
2140
|
+
if (!d.validate(
|
|
2235
2141
|
typeof A == "string" && A.length > 0,
|
|
2236
2142
|
"Converter name must be a non-empty string.",
|
|
2237
2143
|
{ method: "add", providedValue: A }
|
|
2238
|
-
) || !
|
|
2144
|
+
) || !d.validate(
|
|
2239
2145
|
e === "brightness" || e === "custom",
|
|
2240
2146
|
`Converter type must be either "brightness" or "custom". Provided: ${e}`,
|
|
2241
2147
|
{ method: "add", providedValue: e }
|
|
2242
2148
|
))
|
|
2243
2149
|
return;
|
|
2244
2150
|
let t;
|
|
2245
|
-
return e === "brightness" ? t = new
|
|
2151
|
+
return e === "brightness" ? t = new V(this.renderer, this.font, this.grid) : t = new T(this.renderer, this.font, this.grid), this.converters.push({ name: A, converter: t }), t;
|
|
2246
2152
|
}
|
|
2247
2153
|
/**
|
|
2248
2154
|
* Removes a converter from the pipeline by name or instance.
|
|
2249
2155
|
* @param nameOrInstance The unique name of the converter or the converter instance to remove.
|
|
2250
2156
|
*/
|
|
2251
2157
|
remove(A) {
|
|
2252
|
-
if (!
|
|
2253
|
-
typeof A == "string" || A instanceof
|
|
2158
|
+
if (!d.validate(
|
|
2159
|
+
typeof A == "string" || A instanceof T,
|
|
2254
2160
|
"Parameter must be either a string (converter name) or a TextmodeConverter instance.",
|
|
2255
2161
|
{ method: "remove", providedValue: A }
|
|
2256
2162
|
))
|
|
2257
2163
|
return;
|
|
2258
2164
|
let e = -1;
|
|
2259
2165
|
if (typeof A == "string") {
|
|
2260
|
-
if (!
|
|
2166
|
+
if (!d.validate(
|
|
2261
2167
|
A.length > 0,
|
|
2262
2168
|
"Converter name must be a non-empty string.",
|
|
2263
2169
|
{ method: "remove", providedValue: A }
|
|
@@ -2266,7 +2172,7 @@ class FA {
|
|
|
2266
2172
|
e = this.converters.findIndex((t) => t.name === A);
|
|
2267
2173
|
} else
|
|
2268
2174
|
e = this.converters.findIndex((t) => t.converter === A);
|
|
2269
|
-
|
|
2175
|
+
d.validate(
|
|
2270
2176
|
e !== -1,
|
|
2271
2177
|
typeof A == "string" ? `Converter with name "${A}" not found in pipeline.` : "Converter instance not found in pipeline.",
|
|
2272
2178
|
{ method: "remove", providedValue: A, convertersCount: this.converters.length }
|
|
@@ -2345,13 +2251,13 @@ class L {
|
|
|
2345
2251
|
* @returns Object containing all pixel data arrays
|
|
2346
2252
|
*/
|
|
2347
2253
|
extractFramebufferData(A) {
|
|
2348
|
-
const e = A.get("brightness"), t = e == null ? void 0 : e.characterFramebuffer, r = e == null ? void 0 : e.primaryColorFramebuffer, i = e == null ? void 0 : e.secondaryColorFramebuffer, s = e == null ? void 0 : e.transformFramebuffer,
|
|
2349
|
-
return t == null || t.loadPixels(), r == null || r.loadPixels(), i == null || i.loadPixels(), s == null || s.loadPixels(),
|
|
2254
|
+
const e = A.get("brightness"), t = e == null ? void 0 : e.characterFramebuffer, r = e == null ? void 0 : e.primaryColorFramebuffer, i = e == null ? void 0 : e.secondaryColorFramebuffer, s = e == null ? void 0 : e.transformFramebuffer, a = e == null ? void 0 : e.rotationFramebuffer;
|
|
2255
|
+
return t == null || t.loadPixels(), r == null || r.loadPixels(), i == null || i.loadPixels(), s == null || s.loadPixels(), a == null || a.loadPixels(), {
|
|
2350
2256
|
characterPixels: (t == null ? void 0 : t.pixels) || new Uint8Array(0),
|
|
2351
2257
|
primaryColorPixels: (r == null ? void 0 : r.pixels) || new Uint8Array(0),
|
|
2352
2258
|
secondaryColorPixels: (i == null ? void 0 : i.pixels) || new Uint8Array(0),
|
|
2353
2259
|
transformPixels: (s == null ? void 0 : s.pixels) || new Uint8Array(0),
|
|
2354
|
-
rotationPixels: (
|
|
2260
|
+
rotationPixels: (a == null ? void 0 : a.pixels) || new Uint8Array(0)
|
|
2355
2261
|
};
|
|
2356
2262
|
}
|
|
2357
2263
|
/**
|
|
@@ -2437,7 +2343,7 @@ class H {
|
|
|
2437
2343
|
return `'textmode-export'-${this.generateTimestamp()}`;
|
|
2438
2344
|
}
|
|
2439
2345
|
}
|
|
2440
|
-
class
|
|
2346
|
+
class _A extends L {
|
|
2441
2347
|
/**
|
|
2442
2348
|
* Extracts transform data from transform pixels
|
|
2443
2349
|
* @param transformPixels Transform framebuffer pixels
|
|
@@ -2446,9 +2352,9 @@ class yA extends L {
|
|
|
2446
2352
|
* @returns Transform data object
|
|
2447
2353
|
*/
|
|
2448
2354
|
extractTransformData(A, e, t) {
|
|
2449
|
-
const r = A[t], i = A[t + 1], s = A[t + 2],
|
|
2355
|
+
const r = A[t], i = A[t + 1], s = A[t + 2], a = r === 255, g = i === 255, B = s === 255, E = e[t], h = e[t + 1], l = E + h / 255, c = Math.round(l * 360 / 255 * 100) / 100;
|
|
2450
2356
|
return {
|
|
2451
|
-
isInverted:
|
|
2357
|
+
isInverted: a,
|
|
2452
2358
|
flipHorizontal: g,
|
|
2453
2359
|
flipVertical: B,
|
|
2454
2360
|
rotation: c
|
|
@@ -2481,33 +2387,33 @@ class yA extends L {
|
|
|
2481
2387
|
let r = 0;
|
|
2482
2388
|
for (let i = 0; i < e.rows; i++)
|
|
2483
2389
|
for (let s = 0; s < e.cols; s++) {
|
|
2484
|
-
const
|
|
2390
|
+
const a = r * 4, g = this.getCharacterIndex(
|
|
2485
2391
|
A.characterPixels,
|
|
2486
|
-
|
|
2392
|
+
a
|
|
2487
2393
|
);
|
|
2488
|
-
let B = this.pixelsToRGBA(A.primaryColorPixels,
|
|
2489
|
-
const
|
|
2394
|
+
let B = this.pixelsToRGBA(A.primaryColorPixels, a), E = this.pixelsToRGBA(A.secondaryColorPixels, a);
|
|
2395
|
+
const h = this.extractTransformData(
|
|
2490
2396
|
A.transformPixels,
|
|
2491
2397
|
A.rotationPixels,
|
|
2492
|
-
|
|
2398
|
+
a
|
|
2493
2399
|
);
|
|
2494
|
-
if (
|
|
2400
|
+
if (h.isInverted) {
|
|
2495
2401
|
const c = B;
|
|
2496
|
-
B =
|
|
2402
|
+
B = E, E = c;
|
|
2497
2403
|
}
|
|
2498
2404
|
const l = this.calculateCellPosition(s, i, e);
|
|
2499
2405
|
t.push({
|
|
2500
2406
|
charIndex: g,
|
|
2501
2407
|
primaryColor: B,
|
|
2502
|
-
secondaryColor:
|
|
2503
|
-
transform:
|
|
2408
|
+
secondaryColor: E,
|
|
2409
|
+
transform: h,
|
|
2504
2410
|
position: l
|
|
2505
2411
|
}), r++;
|
|
2506
2412
|
}
|
|
2507
2413
|
return t;
|
|
2508
2414
|
}
|
|
2509
2415
|
}
|
|
2510
|
-
class
|
|
2416
|
+
class wA {
|
|
2511
2417
|
/**
|
|
2512
2418
|
* Gets the glyph index for a given Unicode code point in a Typr.js font
|
|
2513
2419
|
* @param fontData The Typr.js font data
|
|
@@ -2526,9 +2432,9 @@ class TA {
|
|
|
2526
2432
|
{
|
|
2527
2433
|
const s = r.idRangeOffset[i] / 2 + (e - r.startCount[i]) - (r.startCount.length - i);
|
|
2528
2434
|
if (s >= 0 && s < r.glyphIdArray.length) {
|
|
2529
|
-
const
|
|
2530
|
-
if (
|
|
2531
|
-
return
|
|
2435
|
+
const a = r.glyphIdArray[s];
|
|
2436
|
+
if (a !== 0)
|
|
2437
|
+
return a + r.idDelta[i] & 65535;
|
|
2532
2438
|
}
|
|
2533
2439
|
}
|
|
2534
2440
|
}
|
|
@@ -2578,34 +2484,34 @@ class TA {
|
|
|
2578
2484
|
*/
|
|
2579
2485
|
glyphToSVGPath(A, e, t, r) {
|
|
2580
2486
|
if (!A || !A.xs) return "";
|
|
2581
|
-
const { xs: i, ys: s, endPts:
|
|
2582
|
-
if (!i || !s || !
|
|
2583
|
-
let B = "",
|
|
2584
|
-
for (let
|
|
2585
|
-
const l =
|
|
2586
|
-
if (!(l <
|
|
2587
|
-
if (l >=
|
|
2588
|
-
const c = e + i[
|
|
2589
|
-
B += `M${c.toFixed(2)},${
|
|
2590
|
-
let u =
|
|
2487
|
+
const { xs: i, ys: s, endPts: a, flags: g } = A;
|
|
2488
|
+
if (!i || !s || !a || !g) return "";
|
|
2489
|
+
let B = "", E = 0;
|
|
2490
|
+
for (let h = 0; h < a.length; h++) {
|
|
2491
|
+
const l = a[h];
|
|
2492
|
+
if (!(l < E)) {
|
|
2493
|
+
if (l >= E) {
|
|
2494
|
+
const c = e + i[E] * r, f = t - s[E] * r;
|
|
2495
|
+
B += `M${c.toFixed(2)},${f.toFixed(2)}`;
|
|
2496
|
+
let u = E + 1;
|
|
2591
2497
|
for (; u <= l; )
|
|
2592
2498
|
if ((g[u] & 1) !== 0) {
|
|
2593
|
-
const
|
|
2594
|
-
B += `L${
|
|
2499
|
+
const P = e + i[u] * r, p = t - s[u] * r;
|
|
2500
|
+
B += `L${P.toFixed(2)},${p.toFixed(2)}`, u++;
|
|
2595
2501
|
} else {
|
|
2596
|
-
const
|
|
2597
|
-
let
|
|
2598
|
-
if ((g[
|
|
2599
|
-
const
|
|
2600
|
-
B += `Q${
|
|
2502
|
+
const P = e + i[u] * r, p = t - s[u] * r;
|
|
2503
|
+
let D = u + 1 > l ? E : u + 1;
|
|
2504
|
+
if ((g[D] & 1) !== 0) {
|
|
2505
|
+
const x = e + i[D] * r, I = t - s[D] * r;
|
|
2506
|
+
B += `Q${P.toFixed(2)},${p.toFixed(2)} ${x.toFixed(2)},${I.toFixed(2)}`, u = D + 1;
|
|
2601
2507
|
} else {
|
|
2602
|
-
const
|
|
2603
|
-
B += `Q${
|
|
2508
|
+
const x = e + i[D] * r, I = t - s[D] * r, b = (P + x) / 2, v = (p + I) / 2;
|
|
2509
|
+
B += `Q${P.toFixed(2)},${p.toFixed(2)} ${b.toFixed(2)},${v.toFixed(2)}`, u = D;
|
|
2604
2510
|
}
|
|
2605
2511
|
}
|
|
2606
2512
|
B += "Z";
|
|
2607
2513
|
}
|
|
2608
|
-
|
|
2514
|
+
E = l + 1;
|
|
2609
2515
|
}
|
|
2610
2516
|
}
|
|
2611
2517
|
return B;
|
|
@@ -2621,14 +2527,14 @@ class TA {
|
|
|
2621
2527
|
*/
|
|
2622
2528
|
generateCharacterPath(A, e, t, r, i) {
|
|
2623
2529
|
try {
|
|
2624
|
-
const s = A.codePointAt(0) || 0,
|
|
2625
|
-
if (
|
|
2530
|
+
const s = A.codePointAt(0) || 0, a = this.getGlyphIndex(e, s);
|
|
2531
|
+
if (a === 0)
|
|
2626
2532
|
return this.createEmptyPath();
|
|
2627
2533
|
let g = null;
|
|
2628
2534
|
try {
|
|
2629
|
-
e.glyf && e.glyf[
|
|
2535
|
+
e.glyf && e.glyf[a] !== null ? g = e.glyf[a] : Q && Q.T && Q.T.glyf && Q.T.glyf._parseGlyf && (g = Q.T.glyf._parseGlyf(e, a), e.glyf && g && (e.glyf[a] = g));
|
|
2630
2536
|
} catch (B) {
|
|
2631
|
-
console.warn(`Failed to parse glyph ${
|
|
2537
|
+
console.warn(`Failed to parse glyph ${a}:`, B);
|
|
2632
2538
|
}
|
|
2633
2539
|
return g ? this.createGlyphPath(e, g, t, r, i) : this.createEmptyPath();
|
|
2634
2540
|
} catch (s) {
|
|
@@ -2647,19 +2553,19 @@ class TA {
|
|
|
2647
2553
|
* @param advanceWidth Character advance width
|
|
2648
2554
|
* @returns SVG path data string or null if generation fails
|
|
2649
2555
|
*/
|
|
2650
|
-
generatePositionedCharacterPath(A, e, t, r, i, s,
|
|
2556
|
+
generatePositionedCharacterPath(A, e, t, r, i, s, a, g) {
|
|
2651
2557
|
try {
|
|
2652
|
-
const B =
|
|
2653
|
-
return this.generateCharacterPath(A, e,
|
|
2558
|
+
const B = a / e.head.unitsPerEm, E = g * B, h = t + (i - E) / 2, l = r + (s + a * 0.7) / 2;
|
|
2559
|
+
return this.generateCharacterPath(A, e, h, l, a).toSVG() || null;
|
|
2654
2560
|
} catch (B) {
|
|
2655
2561
|
return console.warn(`Failed to generate positioned character path for "${A}":`, B), null;
|
|
2656
2562
|
}
|
|
2657
2563
|
}
|
|
2658
2564
|
}
|
|
2659
|
-
class
|
|
2565
|
+
class IA {
|
|
2660
2566
|
constructor() {
|
|
2661
2567
|
o(this, "pathGenerator");
|
|
2662
|
-
this.pathGenerator = new
|
|
2568
|
+
this.pathGenerator = new wA();
|
|
2663
2569
|
}
|
|
2664
2570
|
/**
|
|
2665
2571
|
* Generates the SVG header with metadata
|
|
@@ -2711,12 +2617,12 @@ class SA {
|
|
|
2711
2617
|
* @returns Transform attribute string or empty string
|
|
2712
2618
|
*/
|
|
2713
2619
|
generateTransformAttribute(A, e) {
|
|
2714
|
-
const { transform: t, position: r } = A, i = r.cellX + e.cellWidth / 2, s = r.cellY + e.cellHeight / 2,
|
|
2620
|
+
const { transform: t, position: r } = A, i = r.cellX + e.cellWidth / 2, s = r.cellY + e.cellHeight / 2, a = [];
|
|
2715
2621
|
if (t.flipHorizontal || t.flipVertical) {
|
|
2716
2622
|
const g = t.flipHorizontal ? -1 : 1, B = t.flipVertical ? -1 : 1;
|
|
2717
|
-
|
|
2623
|
+
a.push(`translate(${i} ${s})`), a.push(`scale(${g} ${B})`), a.push(`translate(${-i} ${-s})`);
|
|
2718
2624
|
}
|
|
2719
|
-
return t.rotation &&
|
|
2625
|
+
return t.rotation && a.push(`rotate(${t.rotation} ${i} ${s})`), a.length ? ` transform="${a.join(" ")}"` : "";
|
|
2720
2626
|
}
|
|
2721
2627
|
/**
|
|
2722
2628
|
* Generates background rectangle for a cell
|
|
@@ -2757,10 +2663,10 @@ class SA {
|
|
|
2757
2663
|
);
|
|
2758
2664
|
if (!s)
|
|
2759
2665
|
return "";
|
|
2760
|
-
const
|
|
2666
|
+
const a = this.rgbaToColorString(A.primaryColor);
|
|
2761
2667
|
return r.drawMode === "stroke" ? `
|
|
2762
|
-
<path id="${`path-${A.charIndex}-${A.position.cellX}-${A.position.cellY}`.replace(/\./g, "-")}" d="${s}" stroke="${
|
|
2763
|
-
<path d="${s}" fill="${
|
|
2668
|
+
<path id="${`path-${A.charIndex}-${A.position.cellX}-${A.position.cellY}`.replace(/\./g, "-")}" d="${s}" stroke="${a}" stroke-width="${r.strokeWidth}" fill="none" />` : `
|
|
2669
|
+
<path d="${s}" fill="${a}" />`;
|
|
2764
2670
|
}
|
|
2765
2671
|
/**
|
|
2766
2672
|
* Generates complete SVG content for a single cell
|
|
@@ -2773,10 +2679,10 @@ class SA {
|
|
|
2773
2679
|
generateCellContent(A, e, t, r) {
|
|
2774
2680
|
let i = "";
|
|
2775
2681
|
i += this.generateCellBackground(A, e, r);
|
|
2776
|
-
const s = this.generateTransformAttribute(A, e),
|
|
2777
|
-
return
|
|
2778
|
-
<g${s}>`, i +=
|
|
2779
|
-
</g>`) : i +=
|
|
2682
|
+
const s = this.generateTransformAttribute(A, e), a = this.generateCharacterPath(A, e, t, r);
|
|
2683
|
+
return a && (s ? (i += `
|
|
2684
|
+
<g${s}>`, i += a, i += `
|
|
2685
|
+
</g>`) : i += a), i;
|
|
2780
2686
|
}
|
|
2781
2687
|
/**
|
|
2782
2688
|
* Generates the complete SVG content from cell data
|
|
@@ -2804,7 +2710,7 @@ class SA {
|
|
|
2804
2710
|
`).replace(/[ \t]+$/gm, "");
|
|
2805
2711
|
}
|
|
2806
2712
|
}
|
|
2807
|
-
class
|
|
2713
|
+
class bA extends H {
|
|
2808
2714
|
/**
|
|
2809
2715
|
* Creates a downloadable blob from SVG content
|
|
2810
2716
|
* @param svgContent The SVG content string
|
|
@@ -2834,12 +2740,12 @@ class RA extends H {
|
|
|
2834
2740
|
this.downloadSVG(A, e || this.generateDefaultFilename());
|
|
2835
2741
|
}
|
|
2836
2742
|
}
|
|
2837
|
-
class
|
|
2743
|
+
class J {
|
|
2838
2744
|
constructor() {
|
|
2839
2745
|
o(this, "dataExtractor");
|
|
2840
2746
|
o(this, "contentGenerator");
|
|
2841
2747
|
o(this, "fileHandler");
|
|
2842
|
-
this.dataExtractor = new
|
|
2748
|
+
this.dataExtractor = new _A(), this.contentGenerator = new IA(), this.fileHandler = new bA();
|
|
2843
2749
|
}
|
|
2844
2750
|
/**
|
|
2845
2751
|
* Applies default values to SVG export options
|
|
@@ -2886,7 +2792,7 @@ class X {
|
|
|
2886
2792
|
}
|
|
2887
2793
|
}
|
|
2888
2794
|
}
|
|
2889
|
-
class
|
|
2795
|
+
class vA extends L {
|
|
2890
2796
|
/**
|
|
2891
2797
|
* Extracts character data for TXT generation
|
|
2892
2798
|
* @param framebufferData Framebuffer pixel data
|
|
@@ -2896,16 +2802,16 @@ class MA extends L {
|
|
|
2896
2802
|
* @returns 2D array of characters (rows x columns)
|
|
2897
2803
|
*/
|
|
2898
2804
|
extractCharacterGrid(A, e, t, r = " ") {
|
|
2899
|
-
var
|
|
2805
|
+
var a;
|
|
2900
2806
|
const i = [];
|
|
2901
2807
|
let s = 0;
|
|
2902
2808
|
for (let g = 0; g < e.rows; g++) {
|
|
2903
2809
|
const B = [];
|
|
2904
|
-
for (let
|
|
2905
|
-
const
|
|
2810
|
+
for (let E = 0; E < e.cols; E++) {
|
|
2811
|
+
const h = s * 4, l = this.getCharacterIndex(
|
|
2906
2812
|
A.characterPixels,
|
|
2907
|
-
|
|
2908
|
-
), c = ((
|
|
2813
|
+
h
|
|
2814
|
+
), c = ((a = t.characters[l]) == null ? void 0 : a.character) || r;
|
|
2909
2815
|
B.push(c), s++;
|
|
2910
2816
|
}
|
|
2911
2817
|
i.push(B);
|
|
@@ -2913,7 +2819,7 @@ class MA extends L {
|
|
|
2913
2819
|
return i;
|
|
2914
2820
|
}
|
|
2915
2821
|
}
|
|
2916
|
-
class
|
|
2822
|
+
class xA {
|
|
2917
2823
|
/**
|
|
2918
2824
|
* Generates TXT content from a 2D character array
|
|
2919
2825
|
* @param characterGrid 2D array of characters (rows x columns)
|
|
@@ -2932,7 +2838,7 @@ class GA {
|
|
|
2932
2838
|
return t.join(r);
|
|
2933
2839
|
}
|
|
2934
2840
|
}
|
|
2935
|
-
class
|
|
2841
|
+
class FA extends H {
|
|
2936
2842
|
/**
|
|
2937
2843
|
* Saves TXT content as a downloadable file
|
|
2938
2844
|
* @param content The TXT content to save
|
|
@@ -2956,12 +2862,12 @@ class UA extends H {
|
|
|
2956
2862
|
return e === ".txt" || e.length <= 4 ? this.generateDefaultFilename() : e;
|
|
2957
2863
|
}
|
|
2958
2864
|
}
|
|
2959
|
-
class
|
|
2865
|
+
class K {
|
|
2960
2866
|
constructor() {
|
|
2961
2867
|
o(this, "dataExtractor");
|
|
2962
2868
|
o(this, "contentGenerator");
|
|
2963
2869
|
o(this, "fileHandler");
|
|
2964
|
-
this.dataExtractor = new
|
|
2870
|
+
this.dataExtractor = new vA(), this.contentGenerator = new xA(), this.fileHandler = new FA();
|
|
2965
2871
|
}
|
|
2966
2872
|
/**
|
|
2967
2873
|
* Applies default values to TXT export options
|
|
@@ -3007,7 +2913,7 @@ class $ {
|
|
|
3007
2913
|
}
|
|
3008
2914
|
}
|
|
3009
2915
|
}
|
|
3010
|
-
class
|
|
2916
|
+
class yA extends L {
|
|
3011
2917
|
/**
|
|
3012
2918
|
* Captures the current state of the textmode canvas as image data
|
|
3013
2919
|
* @param canvas The canvas data containing the rendered textmode graphics
|
|
@@ -3019,8 +2925,8 @@ class YA extends L {
|
|
|
3019
2925
|
const r = A.canvas;
|
|
3020
2926
|
if (e === 1 && t === "transparent")
|
|
3021
2927
|
return r;
|
|
3022
|
-
const i = document.createElement("canvas"), s = i.getContext("2d"),
|
|
3023
|
-
return i.width =
|
|
2928
|
+
const i = document.createElement("canvas"), s = i.getContext("2d"), a = Math.round(r.width * e), g = Math.round(r.height * e);
|
|
2929
|
+
return i.width = a, i.height = g, t !== "transparent" && (s.fillStyle = t, s.fillRect(0, 0, a, g)), s.imageSmoothingEnabled = !1, s.drawImage(
|
|
3024
2930
|
r,
|
|
3025
2931
|
0,
|
|
3026
2932
|
0,
|
|
@@ -3028,12 +2934,12 @@ class YA extends L {
|
|
|
3028
2934
|
r.height,
|
|
3029
2935
|
0,
|
|
3030
2936
|
0,
|
|
3031
|
-
|
|
2937
|
+
a,
|
|
3032
2938
|
g
|
|
3033
2939
|
), i;
|
|
3034
2940
|
}
|
|
3035
2941
|
}
|
|
3036
|
-
class
|
|
2942
|
+
class TA {
|
|
3037
2943
|
/**
|
|
3038
2944
|
* Generates image data from canvas
|
|
3039
2945
|
* @param canvas The canvas containing the image data
|
|
@@ -3052,8 +2958,8 @@ class OA {
|
|
|
3052
2958
|
*/
|
|
3053
2959
|
async generateImageBlob(A, e) {
|
|
3054
2960
|
return new Promise((t, r) => {
|
|
3055
|
-
const i = this.getMimeType(e.format), s = (
|
|
3056
|
-
|
|
2961
|
+
const i = this.getMimeType(e.format), s = (a) => {
|
|
2962
|
+
a ? t(a) : r(new Error(`Failed to generate ${e.format.toUpperCase()} blob`));
|
|
3057
2963
|
};
|
|
3058
2964
|
e.format === "png" ? A.toBlob(s, i) : A.toBlob(s, i, e.quality);
|
|
3059
2965
|
});
|
|
@@ -3076,16 +2982,16 @@ class OA {
|
|
|
3076
2982
|
}
|
|
3077
2983
|
}
|
|
3078
2984
|
}
|
|
3079
|
-
const
|
|
2985
|
+
const j = {
|
|
3080
2986
|
png: "image/png",
|
|
3081
2987
|
jpg: "image/jpeg",
|
|
3082
2988
|
webp: "image/webp"
|
|
3083
|
-
},
|
|
2989
|
+
}, Y = {
|
|
3084
2990
|
png: ".png",
|
|
3085
2991
|
jpg: ".jpg",
|
|
3086
2992
|
webp: ".webp"
|
|
3087
2993
|
};
|
|
3088
|
-
class
|
|
2994
|
+
class SA extends H {
|
|
3089
2995
|
/**
|
|
3090
2996
|
* Saves image content as a downloadable file
|
|
3091
2997
|
* @param content The image content (data URL or blob)
|
|
@@ -3094,7 +3000,7 @@ class VA extends H {
|
|
|
3094
3000
|
*/
|
|
3095
3001
|
saveImage(A, e, t) {
|
|
3096
3002
|
try {
|
|
3097
|
-
const r =
|
|
3003
|
+
const r = Y[t];
|
|
3098
3004
|
typeof A == "string" ? this.saveImageFromDataURL(A, this.sanitizeFilename(e) + r) : this.saveImageFromBlob(A, this.sanitizeFilename(e) + r);
|
|
3099
3005
|
} catch (r) {
|
|
3100
3006
|
throw console.error(`Failed to save ${t.toUpperCase()} image:`, r), new Error(`Image save failed: ${r instanceof Error ? r.message : "Unknown error"}`);
|
|
@@ -3129,7 +3035,7 @@ class VA extends H {
|
|
|
3129
3035
|
* @returns True if the format is supported for saving
|
|
3130
3036
|
*/
|
|
3131
3037
|
validateSaveSupport(A) {
|
|
3132
|
-
return A in
|
|
3038
|
+
return A in j && A in Y;
|
|
3133
3039
|
}
|
|
3134
3040
|
/**
|
|
3135
3041
|
* Gets the MIME type for the specified image format
|
|
@@ -3137,7 +3043,7 @@ class VA extends H {
|
|
|
3137
3043
|
* @returns The MIME type string
|
|
3138
3044
|
*/
|
|
3139
3045
|
getMimeType(A) {
|
|
3140
|
-
return
|
|
3046
|
+
return j[A];
|
|
3141
3047
|
}
|
|
3142
3048
|
/**
|
|
3143
3049
|
* Gets the file extension for the specified image format
|
|
@@ -3145,15 +3051,15 @@ class VA extends H {
|
|
|
3145
3051
|
* @returns The file extension (including the dot)
|
|
3146
3052
|
*/
|
|
3147
3053
|
getFileExtension(A) {
|
|
3148
|
-
return
|
|
3054
|
+
return Y[A];
|
|
3149
3055
|
}
|
|
3150
3056
|
}
|
|
3151
|
-
class
|
|
3057
|
+
class RA {
|
|
3152
3058
|
constructor() {
|
|
3153
3059
|
o(this, "dataExtractor");
|
|
3154
3060
|
o(this, "contentGenerator");
|
|
3155
3061
|
o(this, "fileHandler");
|
|
3156
|
-
this.dataExtractor = new
|
|
3062
|
+
this.dataExtractor = new yA(), this.contentGenerator = new TA(), this.fileHandler = new SA();
|
|
3157
3063
|
}
|
|
3158
3064
|
/**
|
|
3159
3065
|
* Applies default values to image export options
|
|
@@ -3236,7 +3142,7 @@ class kA {
|
|
|
3236
3142
|
}
|
|
3237
3143
|
}
|
|
3238
3144
|
}
|
|
3239
|
-
class
|
|
3145
|
+
class G {
|
|
3240
3146
|
constructor(A = null, e = {}) {
|
|
3241
3147
|
/** The element to capture content from (optional for standalone mode) */
|
|
3242
3148
|
o(this, "captureSource");
|
|
@@ -3280,15 +3186,12 @@ class S {
|
|
|
3280
3186
|
* @ignore
|
|
3281
3187
|
*/
|
|
3282
3188
|
static async create(A = null, e = {}) {
|
|
3283
|
-
const t = new
|
|
3284
|
-
t.textmodeCanvas = new
|
|
3189
|
+
const t = new G(A, e), r = t._standalone ? e : void 0;
|
|
3190
|
+
t.textmodeCanvas = new QA(t.captureSource, t._standalone, r), t._renderer = new aA(t.textmodeCanvas.getWebGLContext());
|
|
3285
3191
|
let i, s;
|
|
3286
|
-
t._standalone ? (i = e.width || 800, s = e.height || 600) : (i = t.textmodeCanvas.width || 800, s = t.textmodeCanvas.height || 600), t._canvasFramebuffer = t._renderer.createFramebuffer(i, s), t._font = new
|
|
3287
|
-
const
|
|
3288
|
-
return t._grid = new
|
|
3289
|
-
const g = t.textmodeCanvas.getEffectiveRenderingDimensions();
|
|
3290
|
-
t._renderer.resetViewport(g.width, g.height), t._mode === "auto" && t.render();
|
|
3291
|
-
}), t.startAutoRendering(), t;
|
|
3192
|
+
t._standalone ? (i = e.width || 800, s = e.height || 600) : (i = t.textmodeCanvas.width || 800, s = t.textmodeCanvas.height || 600), t._canvasFramebuffer = t._renderer.createFramebuffer(i, s), t._font = new hA(t._renderer, e.fontSize ?? 16), await t._font.initialize(e.fontSource);
|
|
3193
|
+
const a = t._font.maxGlyphDimensions;
|
|
3194
|
+
return t._grid = new lA(t.textmodeCanvas.canvas, a.width, a.height), t._pipeline = new PA(t._renderer, t._font, t._grid), t.setupEventListeners(), t.startAutoRendering(), t;
|
|
3292
3195
|
}
|
|
3293
3196
|
setupEventListeners() {
|
|
3294
3197
|
this._windowResizeListener = () => {
|
|
@@ -3336,7 +3239,7 @@ class S {
|
|
|
3336
3239
|
* ```
|
|
3337
3240
|
*/
|
|
3338
3241
|
toString(A = {}) {
|
|
3339
|
-
return new
|
|
3242
|
+
return new K().generateTXT(this, A);
|
|
3340
3243
|
}
|
|
3341
3244
|
/**
|
|
3342
3245
|
* Export the current textmode rendering to a TXT file.
|
|
@@ -3361,7 +3264,7 @@ class S {
|
|
|
3361
3264
|
* ```
|
|
3362
3265
|
*/
|
|
3363
3266
|
saveStrings(A = {}) {
|
|
3364
|
-
new
|
|
3267
|
+
new K().saveTXT(this, A);
|
|
3365
3268
|
}
|
|
3366
3269
|
/**
|
|
3367
3270
|
* Generate the current textmode rendering as an SVG string.
|
|
@@ -3390,7 +3293,7 @@ class S {
|
|
|
3390
3293
|
* ```
|
|
3391
3294
|
*/
|
|
3392
3295
|
toSVG(A = {}) {
|
|
3393
|
-
return new
|
|
3296
|
+
return new J().generateSVG(this, A);
|
|
3394
3297
|
}
|
|
3395
3298
|
/**
|
|
3396
3299
|
* Export the current textmode rendering to an SVG file.
|
|
@@ -3414,7 +3317,7 @@ class S {
|
|
|
3414
3317
|
* ```
|
|
3415
3318
|
*/
|
|
3416
3319
|
saveSVG(A = {}) {
|
|
3417
|
-
new
|
|
3320
|
+
new J().saveSVG(this, A);
|
|
3418
3321
|
}
|
|
3419
3322
|
/**
|
|
3420
3323
|
* Export the current textmode rendering to an image file.
|
|
@@ -3445,7 +3348,7 @@ class S {
|
|
|
3445
3348
|
* ```
|
|
3446
3349
|
*/
|
|
3447
3350
|
async saveCanvas(A, e = "png", t = {}) {
|
|
3448
|
-
await new
|
|
3351
|
+
await new RA().saveImage(this.textmodeCanvas, {
|
|
3449
3352
|
...t,
|
|
3450
3353
|
filename: A,
|
|
3451
3354
|
format: e
|
|
@@ -3529,12 +3432,7 @@ class S {
|
|
|
3529
3432
|
}
|
|
3530
3433
|
}
|
|
3531
3434
|
resize() {
|
|
3532
|
-
|
|
3533
|
-
const A = this.textmodeCanvas.getEffectiveRenderingDimensions();
|
|
3534
|
-
this._renderer.resetViewport(A.width, A.height);
|
|
3535
|
-
} else
|
|
3536
|
-
this._renderer.resetViewport();
|
|
3537
|
-
this._mode !== "manual" && this.render();
|
|
3435
|
+
this.textmodeCanvas.resize(), this._canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this._grid.resize(), this._pipeline.resize(), this._renderer.resetViewport(), this._mode !== "manual" && this.render();
|
|
3538
3436
|
}
|
|
3539
3437
|
/**
|
|
3540
3438
|
* Start automatic rendering
|
|
@@ -3712,7 +3610,7 @@ class S {
|
|
|
3712
3610
|
* ```
|
|
3713
3611
|
*/
|
|
3714
3612
|
redraw(A = 1) {
|
|
3715
|
-
if (
|
|
3613
|
+
if (d.validate(
|
|
3716
3614
|
typeof A == "number" && A > 0 && Number.isInteger(A),
|
|
3717
3615
|
"Redraw count must be a positive integer.",
|
|
3718
3616
|
{ method: "redraw", providedValue: A }
|
|
@@ -3768,16 +3666,11 @@ class S {
|
|
|
3768
3666
|
* ```
|
|
3769
3667
|
*/
|
|
3770
3668
|
fontSize(A) {
|
|
3771
|
-
|
|
3669
|
+
d.validate(
|
|
3772
3670
|
typeof A == "number" && A > 0,
|
|
3773
3671
|
"Font size must be a positive number greater than 0.",
|
|
3774
3672
|
{ method: "fontSize", providedValue: A }
|
|
3775
|
-
) && this._font.fontSize !== A)
|
|
3776
|
-
if (this._font.setFontSize(A), this._grid.resizeCellPixelDimensions(this._font.maxGlyphDimensions.width, this._font.maxGlyphDimensions.height), this._pipeline.resize(), this._standalone) {
|
|
3777
|
-
const e = this.textmodeCanvas.getEffectiveRenderingDimensions();
|
|
3778
|
-
this._renderer.resetViewport(e.width, e.height);
|
|
3779
|
-
} else
|
|
3780
|
-
this._renderer.resetViewport();
|
|
3673
|
+
) && this._font.fontSize !== A && (this._font.setFontSize(A), this._grid.resizeCellPixelDimensions(this._font.maxGlyphDimensions.width, this._font.maxGlyphDimensions.height), this._pipeline.resize(), this._renderer.resetViewport());
|
|
3781
3674
|
}
|
|
3782
3675
|
/**
|
|
3783
3676
|
* Set a draw callback function that will be executed before each render.
|
|
@@ -3844,12 +3737,7 @@ class S {
|
|
|
3844
3737
|
* @param height The new height of the canvas.
|
|
3845
3738
|
*/
|
|
3846
3739
|
resizeCanvas(A, e) {
|
|
3847
|
-
|
|
3848
|
-
const t = this.textmodeCanvas.getEffectiveRenderingDimensions();
|
|
3849
|
-
this._renderer.resetViewport(t.width, t.height);
|
|
3850
|
-
} else
|
|
3851
|
-
this._renderer.resetViewport();
|
|
3852
|
-
this._mode !== "manual" && this.render();
|
|
3740
|
+
this.textmodeCanvas.resize(A, e), this._canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this._grid.resize(), this._pipeline.resize(), this._renderer.resetViewport(), this._mode !== "manual" && this.render();
|
|
3853
3741
|
}
|
|
3854
3742
|
/**
|
|
3855
3743
|
* @inheritDoc TextmodeConversionPipeline.get
|
|
@@ -4432,10 +4320,10 @@ class N {
|
|
|
4432
4320
|
*/
|
|
4433
4321
|
static async create(A, e = {}) {
|
|
4434
4322
|
if (A instanceof HTMLCanvasElement || A instanceof HTMLVideoElement)
|
|
4435
|
-
return
|
|
4323
|
+
return G.create(A, e);
|
|
4436
4324
|
{
|
|
4437
4325
|
const t = A || {};
|
|
4438
|
-
return
|
|
4326
|
+
return G.create(null, t);
|
|
4439
4327
|
}
|
|
4440
4328
|
}
|
|
4441
4329
|
/**
|
|
@@ -4449,7 +4337,7 @@ class N {
|
|
|
4449
4337
|
* ```
|
|
4450
4338
|
*/
|
|
4451
4339
|
static setErrorLevel(A) {
|
|
4452
|
-
|
|
4340
|
+
d.setGlobalLevel(A);
|
|
4453
4341
|
}
|
|
4454
4342
|
/**
|
|
4455
4343
|
* Returns the current version of the `textmode.js` library.
|
|
@@ -4460,27 +4348,27 @@ class N {
|
|
|
4460
4348
|
* ```
|
|
4461
4349
|
*/
|
|
4462
4350
|
static get version() {
|
|
4463
|
-
return "0.1.6-beta.
|
|
4351
|
+
return "0.1.6-beta.4";
|
|
4464
4352
|
}
|
|
4465
4353
|
constructor() {
|
|
4466
4354
|
throw new Error("Textmode is a static class and cannot be instantiated.");
|
|
4467
4355
|
}
|
|
4468
4356
|
}
|
|
4469
|
-
const
|
|
4357
|
+
const GA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
4470
4358
|
__proto__: null
|
|
4471
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
4359
|
+
}, Symbol.toStringTag, { value: "Module" })), YA = N.create, kA = N.setErrorLevel, OA = N.version;
|
|
4472
4360
|
export {
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
|
|
4477
|
-
|
|
4478
|
-
|
|
4479
|
-
|
|
4480
|
-
|
|
4361
|
+
QA as TextmodeCanvas,
|
|
4362
|
+
PA as TextmodeConversionPipeline,
|
|
4363
|
+
tA as TextmodeErrorLevel,
|
|
4364
|
+
hA as TextmodeFont,
|
|
4365
|
+
lA as TextmodeGrid,
|
|
4366
|
+
G as Textmodifier,
|
|
4367
|
+
MA as converters,
|
|
4368
|
+
YA as create,
|
|
4481
4369
|
N as default,
|
|
4482
|
-
|
|
4483
|
-
|
|
4370
|
+
GA as export,
|
|
4371
|
+
kA as setErrorLevel,
|
|
4484
4372
|
N as textmode,
|
|
4485
|
-
|
|
4373
|
+
OA as version
|
|
4486
4374
|
};
|