textmode.js 0.0.6 → 0.0.7
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
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
var F = Object.defineProperty;
|
|
2
|
-
var y = (s,
|
|
3
|
-
var Q = (s,
|
|
4
|
-
class
|
|
5
|
-
constructor(
|
|
6
|
-
const B =
|
|
2
|
+
var y = (s, A, e) => A in s ? F(s, A, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[A] = e;
|
|
3
|
+
var Q = (s, A, e) => y(s, typeof A != "symbol" ? A + "" : A, e);
|
|
4
|
+
class D extends Error {
|
|
5
|
+
constructor(e, t, r = {}) {
|
|
6
|
+
const B = D.createFormattedMessage(e, r);
|
|
7
7
|
super(B);
|
|
8
8
|
Q(this, "originalError");
|
|
9
9
|
Q(this, "context");
|
|
@@ -12,14 +12,14 @@ class l extends Error {
|
|
|
12
12
|
/**
|
|
13
13
|
* Create a formatted error message that includes context
|
|
14
14
|
*/
|
|
15
|
-
static createFormattedMessage(
|
|
16
|
-
let r =
|
|
15
|
+
static createFormattedMessage(e, t) {
|
|
16
|
+
let r = e;
|
|
17
17
|
if (t && Object.keys(t).length > 0) {
|
|
18
18
|
r += `
|
|
19
19
|
|
|
20
20
|
📋 Context:`;
|
|
21
21
|
for (const [B, E] of Object.entries(t)) {
|
|
22
|
-
const g =
|
|
22
|
+
const g = D.formatValue(E);
|
|
23
23
|
r += `
|
|
24
24
|
- ${B}: ${g}`;
|
|
25
25
|
}
|
|
@@ -32,22 +32,22 @@ class l extends Error {
|
|
|
32
32
|
/**
|
|
33
33
|
* Format values for better display in error messages
|
|
34
34
|
*/
|
|
35
|
-
static formatValue(
|
|
36
|
-
if (
|
|
37
|
-
if (
|
|
38
|
-
if (typeof
|
|
39
|
-
if (typeof
|
|
40
|
-
if (Array.isArray(
|
|
41
|
-
return
|
|
42
|
-
if (typeof
|
|
43
|
-
const t = Object.keys(
|
|
44
|
-
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((E) => `${E}: ${
|
|
35
|
+
static formatValue(e) {
|
|
36
|
+
if (e === null) return "null";
|
|
37
|
+
if (e === void 0) return "undefined";
|
|
38
|
+
if (typeof e == "string") return `"${e}"`;
|
|
39
|
+
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
40
|
+
if (Array.isArray(e))
|
|
41
|
+
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) => D.formatValue(t)).join(", ")}]` : `[${e.slice(0, 3).map((t) => D.formatValue(t)).join(", ")}, ... +${e.length - 3} more]`;
|
|
42
|
+
if (typeof e == "object") {
|
|
43
|
+
const t = Object.keys(e);
|
|
44
|
+
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((E) => `${E}: ${D.formatValue(e[E])}`).join(", ")} }` : `{ ${t.slice(0, 2).map((B) => `${B}: ${D.formatValue(e[B])}`).join(", ")}, ... +${t.length - 2} more }`;
|
|
45
45
|
}
|
|
46
|
-
return String(
|
|
46
|
+
return String(e);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
var T = /* @__PURE__ */ ((s) => (s[s.SILENT = 0] = "SILENT", s[s.WARNING = 1] = "WARNING", s[s.ERROR = 2] = "ERROR", s[s.THROW = 3] = "THROW", s))(T || {});
|
|
50
|
-
const
|
|
50
|
+
const c = class c {
|
|
51
51
|
constructor() {
|
|
52
52
|
Q(this, "_options", {
|
|
53
53
|
globalLevel: 3
|
|
@@ -55,13 +55,13 @@ const D = class D {
|
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
static getInstance() {
|
|
58
|
-
return
|
|
58
|
+
return c._instance || (c._instance = new c()), c._instance;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Handle an error based on the configured settings
|
|
62
62
|
* @returns true if execution should continue, false if error was handled
|
|
63
63
|
*/
|
|
64
|
-
_handle(
|
|
64
|
+
_handle(A, e, t) {
|
|
65
65
|
const r = "[textmode.js]";
|
|
66
66
|
switch (this._options.globalLevel) {
|
|
67
67
|
case 0:
|
|
@@ -71,15 +71,15 @@ const D = class D {
|
|
|
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(D.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(D.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
80
80
|
case 3:
|
|
81
81
|
default:
|
|
82
|
-
const B = new
|
|
82
|
+
const B = new D(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;"
|
|
@@ -93,133 +93,87 @@ const D = class D {
|
|
|
93
93
|
* @param context Additional context for debugging
|
|
94
94
|
* @returns true if validation passed, false if validation failed and was handled
|
|
95
95
|
*/
|
|
96
|
-
validate(
|
|
97
|
-
return
|
|
96
|
+
validate(A, e, t) {
|
|
97
|
+
return A ? !0 : (this._handle(e, t), !1);
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
100
|
* Set global error level
|
|
101
101
|
*/
|
|
102
|
-
setGlobalLevel(
|
|
103
|
-
this._options.globalLevel =
|
|
102
|
+
setGlobalLevel(A) {
|
|
103
|
+
this._options.globalLevel = A;
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
|
-
Q(
|
|
107
|
-
let I =
|
|
106
|
+
Q(c, "_instance", null);
|
|
107
|
+
let I = c;
|
|
108
108
|
const C = I.getInstance();
|
|
109
109
|
class M {
|
|
110
|
-
constructor(
|
|
110
|
+
constructor(A, e, t = e, r = {}) {
|
|
111
111
|
Q(this, "gl");
|
|
112
112
|
Q(this, "_framebuffer");
|
|
113
113
|
Q(this, "_texture");
|
|
114
114
|
Q(this, "_width");
|
|
115
115
|
Q(this, "_height");
|
|
116
116
|
Q(this, "options");
|
|
117
|
-
Q(this, "
|
|
118
|
-
|
|
119
|
-
this.gl = e, this._width = A, this._height = t, this.options = {
|
|
117
|
+
Q(this, "previousState", null);
|
|
118
|
+
this.gl = A, this._width = e, this._height = t, this.options = {
|
|
120
119
|
filter: "nearest",
|
|
121
120
|
wrap: "clamp",
|
|
122
121
|
format: "rgba",
|
|
123
122
|
type: "unsigned_byte",
|
|
124
123
|
...r
|
|
125
|
-
}, this._texture = this.createTexture(), this._framebuffer =
|
|
124
|
+
}, this._texture = this.createTexture(), this._framebuffer = A.createFramebuffer(), this.attachTexture();
|
|
126
125
|
}
|
|
127
126
|
createTexture() {
|
|
128
|
-
const e =
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
r,
|
|
137
|
-
this._width,
|
|
138
|
-
this._height,
|
|
139
|
-
0,
|
|
140
|
-
r,
|
|
141
|
-
B,
|
|
142
|
-
null
|
|
143
|
-
), this.gl.bindTexture(this.gl.TEXTURE_2D, null), e;
|
|
127
|
+
const { gl: A } = this, e = A.createTexture();
|
|
128
|
+
A.bindTexture(A.TEXTURE_2D, e);
|
|
129
|
+
const t = this.options.filter === "linear" ? A.LINEAR : A.NEAREST, r = this.options.wrap === "repeat" ? A.REPEAT : A.CLAMP_TO_EDGE;
|
|
130
|
+
return A.texParameteri(A.TEXTURE_2D, A.TEXTURE_MIN_FILTER, t), A.texParameteri(A.TEXTURE_2D, A.TEXTURE_MAG_FILTER, t), A.texParameteri(A.TEXTURE_2D, A.TEXTURE_WRAP_S, r), A.texParameteri(A.TEXTURE_2D, A.TEXTURE_WRAP_T, r), this.updateTextureSize(), e;
|
|
131
|
+
}
|
|
132
|
+
updateTextureSize() {
|
|
133
|
+
const { gl: A } = this, e = this.options.format === "rgb" ? A.RGB : A.RGBA, t = this.options.type === "float" ? A.FLOAT : A.UNSIGNED_BYTE;
|
|
134
|
+
A.texImage2D(A.TEXTURE_2D, 0, e, this._width, this._height, 0, e, t, null);
|
|
144
135
|
}
|
|
145
136
|
attachTexture() {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
this.gl.COLOR_ATTACHMENT0,
|
|
149
|
-
this.gl.TEXTURE_2D,
|
|
150
|
-
this._texture,
|
|
151
|
-
0
|
|
152
|
-
), this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
|
|
137
|
+
const { gl: A } = this;
|
|
138
|
+
A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.framebufferTexture2D(A.FRAMEBUFFER, A.COLOR_ATTACHMENT0, A.TEXTURE_2D, this._texture, 0), A.bindFramebuffer(A.FRAMEBUFFER, null);
|
|
153
139
|
}
|
|
154
140
|
/**
|
|
155
141
|
* Update the framebuffer texture with canvas content
|
|
156
142
|
*/
|
|
157
|
-
update(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
0,
|
|
161
|
-
this.gl.RGBA,
|
|
162
|
-
this.gl.RGBA,
|
|
163
|
-
this.gl.UNSIGNED_BYTE,
|
|
164
|
-
e
|
|
165
|
-
), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
143
|
+
update(A) {
|
|
144
|
+
const { gl: e } = this;
|
|
145
|
+
e.bindTexture(e.TEXTURE_2D, this._texture), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, A), e.bindTexture(e.TEXTURE_2D, null);
|
|
166
146
|
}
|
|
167
147
|
/**
|
|
168
148
|
* Update the framebuffer texture with pixel data
|
|
169
149
|
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
0,
|
|
174
|
-
this.gl.RGBA,
|
|
175
|
-
A,
|
|
176
|
-
t,
|
|
177
|
-
0,
|
|
178
|
-
this.gl.RGBA,
|
|
179
|
-
this.gl.UNSIGNED_BYTE,
|
|
180
|
-
e
|
|
181
|
-
), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
150
|
+
updatePixels(A, e, t) {
|
|
151
|
+
const { gl: r } = this;
|
|
152
|
+
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
153
|
}
|
|
183
154
|
/**
|
|
184
155
|
* Resize the framebuffer
|
|
185
156
|
*/
|
|
186
|
-
resize(
|
|
187
|
-
this._width =
|
|
188
|
-
const t = this.options.format === "rgb" ? this.gl.RGB : this.gl.RGBA, r = this.options.type === "float" ? this.gl.FLOAT : this.gl.UNSIGNED_BYTE;
|
|
189
|
-
this.gl.texImage2D(
|
|
190
|
-
this.gl.TEXTURE_2D,
|
|
191
|
-
0,
|
|
192
|
-
t,
|
|
193
|
-
this._width,
|
|
194
|
-
this._height,
|
|
195
|
-
0,
|
|
196
|
-
t,
|
|
197
|
-
r,
|
|
198
|
-
null
|
|
199
|
-
);
|
|
157
|
+
resize(A, e) {
|
|
158
|
+
this._width = A, this._height = e, this.gl.bindTexture(this.gl.TEXTURE_2D, this._texture), this.updateTextureSize(), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
200
159
|
}
|
|
201
160
|
/**
|
|
202
|
-
* Begin rendering to this framebuffer
|
|
161
|
+
* Begin rendering to this framebuffer
|
|
203
162
|
*/
|
|
204
163
|
begin() {
|
|
205
|
-
|
|
164
|
+
const { gl: A } = this;
|
|
165
|
+
this.previousState = {
|
|
166
|
+
framebuffer: A.getParameter(A.FRAMEBUFFER_BINDING),
|
|
167
|
+
viewport: A.getParameter(A.VIEWPORT)
|
|
168
|
+
}, A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.viewport(0, 0, this._width, this._height);
|
|
206
169
|
}
|
|
207
170
|
/**
|
|
208
|
-
* End rendering to this framebuffer and restore previous state
|
|
171
|
+
* End rendering to this framebuffer and restore previous state
|
|
209
172
|
*/
|
|
210
173
|
end() {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
this.previousViewport[2],
|
|
215
|
-
this.previousViewport[3]
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Bind this framebuffer for rendering
|
|
220
|
-
*/
|
|
221
|
-
bind() {
|
|
222
|
-
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this._framebuffer), this.gl.viewport(0, 0, this._width, this._height);
|
|
174
|
+
if (!this.previousState) return;
|
|
175
|
+
const { gl: A } = this;
|
|
176
|
+
A.bindFramebuffer(A.FRAMEBUFFER, this.previousState.framebuffer), A.viewport(...this.previousState.viewport), this.previousState = null;
|
|
223
177
|
}
|
|
224
178
|
// Getters
|
|
225
179
|
get framebuffer() {
|
|
@@ -236,20 +190,20 @@ class M {
|
|
|
236
190
|
}
|
|
237
191
|
}
|
|
238
192
|
class G {
|
|
239
|
-
constructor(
|
|
193
|
+
constructor(A, e, t, r, B) {
|
|
240
194
|
/** The WebGL rendering context */
|
|
241
195
|
Q(this, "gl");
|
|
242
196
|
/** The buffer containing the rectangle vertices */
|
|
243
197
|
Q(this, "buffer");
|
|
244
198
|
/** The number of vertices in the rectangle */
|
|
245
199
|
Q(this, "numVertices");
|
|
246
|
-
this.gl =
|
|
247
|
-
const E =
|
|
200
|
+
this.gl = A;
|
|
201
|
+
const E = A.getParameter(A.VIEWPORT), g = E[2], i = E[3];
|
|
248
202
|
if (g <= 0 || i <= 0)
|
|
249
203
|
throw new Error(`Invalid viewport dimensions: ${g}x${i}`);
|
|
250
|
-
const o =
|
|
204
|
+
const o = e / g * 2 - 1, n = 1 - t / i * 2, a = (e + r) / g * 2 - 1, h = 1 - (t + B) / i * 2;
|
|
251
205
|
(o < -1 || o > 1 || a < -1 || a > 1 || n < -1 || n > 1 || h < -1 || h > 1) && console.warn(`Rectangle coordinates outside NDC range: x1=${o}, y1=${n}, x2=${a}, y2=${h}`);
|
|
252
|
-
const
|
|
206
|
+
const u = A.getParameter(A.FRAMEBUFFER_BINDING) !== null ? new Float32Array([
|
|
253
207
|
o,
|
|
254
208
|
h,
|
|
255
209
|
0,
|
|
@@ -312,49 +266,49 @@ class G {
|
|
|
312
266
|
0
|
|
313
267
|
// top-right
|
|
314
268
|
]);
|
|
315
|
-
this.numVertices = 6, this.buffer =
|
|
269
|
+
this.numVertices = 6, this.buffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.buffer), A.bufferData(A.ARRAY_BUFFER, u, A.STATIC_DRAW);
|
|
316
270
|
}
|
|
317
271
|
/**
|
|
318
272
|
* Draw the quad using attribute locations from the current shader
|
|
319
273
|
*/
|
|
320
274
|
draw() {
|
|
321
275
|
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);
|
|
322
|
-
let
|
|
323
|
-
this.gl.enableVertexAttribArray(
|
|
276
|
+
let A = 0, e = 1;
|
|
277
|
+
this.gl.enableVertexAttribArray(A), this.gl.vertexAttribPointer(A, 2, this.gl.FLOAT, !1, 16, 0), this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, 16, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.numVertices), this.gl.disableVertexAttribArray(A), this.gl.disableVertexAttribArray(e);
|
|
324
278
|
}
|
|
325
279
|
}
|
|
326
|
-
class
|
|
327
|
-
constructor(
|
|
280
|
+
class l {
|
|
281
|
+
constructor(A, e, t) {
|
|
328
282
|
Q(this, "gl");
|
|
329
283
|
Q(this, "program");
|
|
330
284
|
Q(this, "uniformLocations", /* @__PURE__ */ new Map());
|
|
331
285
|
Q(this, "attributeLocations", /* @__PURE__ */ new Map());
|
|
332
286
|
Q(this, "textureUnitCounter", 0);
|
|
333
|
-
this.gl =
|
|
287
|
+
this.gl = A, this.program = this.createProgram(e, t), this.cacheLocations();
|
|
334
288
|
}
|
|
335
|
-
createProgram(
|
|
336
|
-
const t = this.createShader(this.gl.VERTEX_SHADER,
|
|
289
|
+
createProgram(A, e) {
|
|
290
|
+
const t = this.createShader(this.gl.VERTEX_SHADER, A), r = this.createShader(this.gl.FRAGMENT_SHADER, e), B = this.gl.createProgram();
|
|
337
291
|
if (this.gl.attachShader(B, t), this.gl.attachShader(B, r), this.gl.linkProgram(B), !this.gl.getProgramParameter(B, this.gl.LINK_STATUS)) {
|
|
338
292
|
const E = this.gl.getProgramInfoLog(B);
|
|
339
293
|
throw new Error(`Shader program link error: ${E}`);
|
|
340
294
|
}
|
|
341
295
|
return this.gl.deleteShader(t), this.gl.deleteShader(r), B;
|
|
342
296
|
}
|
|
343
|
-
createShader(
|
|
344
|
-
const t = this.gl.createShader(
|
|
345
|
-
return this.gl.shaderSource(t,
|
|
297
|
+
createShader(A, e) {
|
|
298
|
+
const t = this.gl.createShader(A);
|
|
299
|
+
return this.gl.shaderSource(t, e), this.gl.compileShader(t), t;
|
|
346
300
|
}
|
|
347
301
|
cacheLocations() {
|
|
348
|
-
const
|
|
349
|
-
for (let t = 0; t <
|
|
302
|
+
const A = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_UNIFORMS);
|
|
303
|
+
for (let t = 0; t < A; t++) {
|
|
350
304
|
const r = this.gl.getActiveUniform(this.program, t);
|
|
351
305
|
if (r) {
|
|
352
306
|
const B = this.gl.getUniformLocation(this.program, r.name);
|
|
353
307
|
B && this.uniformLocations.set(r.name, B);
|
|
354
308
|
}
|
|
355
309
|
}
|
|
356
|
-
const
|
|
357
|
-
for (let t = 0; t <
|
|
310
|
+
const e = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_ATTRIBUTES);
|
|
311
|
+
for (let t = 0; t < e; t++) {
|
|
358
312
|
const r = this.gl.getActiveAttrib(this.program, t);
|
|
359
313
|
if (r) {
|
|
360
314
|
const B = this.gl.getAttribLocation(this.program, r.name);
|
|
@@ -371,34 +325,34 @@ class c {
|
|
|
371
325
|
/**
|
|
372
326
|
* Set a single uniform value with automatic texture unit management
|
|
373
327
|
*/
|
|
374
|
-
setUniform(
|
|
375
|
-
const t = this.uniformLocations.get(
|
|
376
|
-
if (typeof
|
|
377
|
-
this.gl.uniform1f(t,
|
|
378
|
-
else if (typeof
|
|
379
|
-
this.gl.uniform1i(t,
|
|
380
|
-
else if (Array.isArray(
|
|
381
|
-
switch (
|
|
328
|
+
setUniform(A, e) {
|
|
329
|
+
const t = this.uniformLocations.get(A);
|
|
330
|
+
if (typeof e == "number")
|
|
331
|
+
this.gl.uniform1f(t, e);
|
|
332
|
+
else if (typeof e == "boolean")
|
|
333
|
+
this.gl.uniform1i(t, e ? 1 : 0);
|
|
334
|
+
else if (Array.isArray(e))
|
|
335
|
+
switch (e.length) {
|
|
382
336
|
case 2:
|
|
383
|
-
this.gl.uniform2f(t,
|
|
337
|
+
this.gl.uniform2f(t, e[0], e[1]);
|
|
384
338
|
break;
|
|
385
339
|
case 3:
|
|
386
|
-
this.gl.uniform3f(t,
|
|
340
|
+
this.gl.uniform3f(t, e[0], e[1], e[2]);
|
|
387
341
|
break;
|
|
388
342
|
case 4:
|
|
389
|
-
this.gl.uniform4f(t,
|
|
343
|
+
this.gl.uniform4f(t, e[0], e[1], e[2], e[3]);
|
|
390
344
|
break;
|
|
391
345
|
default:
|
|
392
|
-
console.warn(`Unsupported array length ${
|
|
346
|
+
console.warn(`Unsupported array length ${e.length} for uniform '${A}'`);
|
|
393
347
|
}
|
|
394
|
-
else if (
|
|
348
|
+
else if (e instanceof WebGLTexture) {
|
|
395
349
|
const r = this.getNextTextureUnit();
|
|
396
|
-
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D,
|
|
397
|
-
} else if (
|
|
350
|
+
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D, e);
|
|
351
|
+
} else if (e && typeof e == "object" && "texture" in e) {
|
|
398
352
|
const r = this.getNextTextureUnit();
|
|
399
|
-
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D,
|
|
353
|
+
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D, e.texture);
|
|
400
354
|
} else
|
|
401
|
-
console.warn(`Unsupported uniform type for '${
|
|
355
|
+
console.warn(`Unsupported uniform type for '${A}':`, typeof e);
|
|
402
356
|
}
|
|
403
357
|
getNextTextureUnit() {
|
|
404
358
|
return this.textureUnitCounter++;
|
|
@@ -410,55 +364,52 @@ class c {
|
|
|
410
364
|
this.textureUnitCounter = 0;
|
|
411
365
|
}
|
|
412
366
|
}
|
|
413
|
-
var
|
|
367
|
+
var P = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.0,1.0);}", U = "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}";
|
|
414
368
|
class R {
|
|
415
|
-
constructor(
|
|
369
|
+
constructor(A) {
|
|
416
370
|
Q(this, "gl");
|
|
417
371
|
Q(this, "imageShader");
|
|
418
372
|
Q(this, "currentShader", null);
|
|
419
|
-
this.gl =
|
|
420
|
-
}
|
|
421
|
-
setupDefaultState() {
|
|
422
|
-
this.gl.enable(this.gl.BLEND), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA), this.gl.disable(this.gl.DEPTH_TEST), this.gl.disable(this.gl.CULL_FACE), this.gl.disable(this.gl.STENCIL_TEST), this.gl.disable(this.gl.SCISSOR_TEST), this.gl.disable(this.gl.DITHER), this.gl.depthFunc(this.gl.ALWAYS), this.gl.depthMask(!1);
|
|
373
|
+
this.gl = A, this.imageShader = new l(this.gl, P, U), this.gl.enable(this.gl.BLEND), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
|
|
423
374
|
}
|
|
424
375
|
/**
|
|
425
376
|
* Set the current shader (p5.js-like API)
|
|
426
377
|
*/
|
|
427
|
-
shader(
|
|
428
|
-
this.currentShader =
|
|
378
|
+
shader(A) {
|
|
379
|
+
this.currentShader = A, A.use();
|
|
429
380
|
}
|
|
430
|
-
createShader(
|
|
431
|
-
return new
|
|
381
|
+
createShader(A, e) {
|
|
382
|
+
return new l(this.gl, A, e);
|
|
432
383
|
}
|
|
433
384
|
/**
|
|
434
385
|
* Set a uniform value for the current shader (p5.js-like API)
|
|
435
386
|
*/
|
|
436
|
-
setUniform(
|
|
437
|
-
this.currentShader.setUniform(
|
|
387
|
+
setUniform(A, e) {
|
|
388
|
+
this.currentShader.setUniform(A, e);
|
|
438
389
|
}
|
|
439
390
|
/**
|
|
440
391
|
* Draw a rectangle with the current shader (p5.js-like API)
|
|
441
392
|
*/
|
|
442
|
-
rect(
|
|
443
|
-
new G(this.gl,
|
|
393
|
+
rect(A, e, t, r) {
|
|
394
|
+
new G(this.gl, A, e, t, r).draw();
|
|
444
395
|
}
|
|
445
396
|
/**
|
|
446
397
|
* Create a new framebuffer
|
|
447
398
|
*/
|
|
448
|
-
createFramebuffer(
|
|
449
|
-
return new M(this.gl,
|
|
399
|
+
createFramebuffer(A, e, t = {}) {
|
|
400
|
+
return new M(this.gl, A, e, t);
|
|
450
401
|
}
|
|
451
402
|
/**
|
|
452
403
|
* Fill the current framebuffer with a solid color (p5.js-like API)
|
|
453
404
|
*/
|
|
454
|
-
background(
|
|
455
|
-
this.clear(
|
|
405
|
+
background(A, e = A, t = A, r = 1) {
|
|
406
|
+
this.clear(A / 255, e / 255, t / 255, r);
|
|
456
407
|
}
|
|
457
408
|
/**
|
|
458
409
|
* Clear the current framebuffer
|
|
459
410
|
*/
|
|
460
|
-
clear(
|
|
461
|
-
this.gl.clearColor(
|
|
411
|
+
clear(A = 0, e = 0, t = 0, r = 0) {
|
|
412
|
+
this.gl.clearColor(A, e, t, r), this.gl.clear(this.gl.COLOR_BUFFER_BIT);
|
|
462
413
|
}
|
|
463
414
|
/**
|
|
464
415
|
* Ensure viewport matches canvas dimensions
|
|
@@ -475,8 +426,8 @@ class R {
|
|
|
475
426
|
/**
|
|
476
427
|
* Render a framebuffer at a specific position with optional scaling
|
|
477
428
|
*/
|
|
478
|
-
image(
|
|
479
|
-
this.shader(this.imageShader), this.setUniform("u_texture",
|
|
429
|
+
image(A, e, t, r, B) {
|
|
430
|
+
this.shader(this.imageShader), this.setUniform("u_texture", A.texture), this.rect(e, t, r ?? A.width, B ?? A.height);
|
|
480
431
|
}
|
|
481
432
|
}
|
|
482
433
|
class Y {
|
|
@@ -487,30 +438,30 @@ class Y {
|
|
|
487
438
|
/**
|
|
488
439
|
* Parse a font buffer and return font data
|
|
489
440
|
*/
|
|
490
|
-
parse(
|
|
491
|
-
const
|
|
441
|
+
parse(A) {
|
|
442
|
+
const e = new Uint8Array(A);
|
|
492
443
|
let t = 0;
|
|
493
|
-
if (this.bin.readASCII(
|
|
494
|
-
const B = this.bin.readUint(
|
|
444
|
+
if (this.bin.readASCII(e, t, 4) === "ttcf") {
|
|
445
|
+
const B = this.bin.readUint(e, t + 8);
|
|
495
446
|
t += 12;
|
|
496
447
|
const E = [];
|
|
497
448
|
for (let g = 0; g < B; g++) {
|
|
498
|
-
const i = this.bin.readUint(
|
|
499
|
-
t += 4, E.push(this.readFont(
|
|
449
|
+
const i = this.bin.readUint(e, t);
|
|
450
|
+
t += 4, E.push(this.readFont(e, g, i));
|
|
500
451
|
}
|
|
501
452
|
return E;
|
|
502
453
|
} else
|
|
503
|
-
return [this.readFont(
|
|
454
|
+
return [this.readFont(e, 0, 0)];
|
|
504
455
|
}
|
|
505
456
|
/**
|
|
506
457
|
* Find a table in the font data
|
|
507
458
|
*/
|
|
508
|
-
findTable(
|
|
509
|
-
const r = this.bin.readUshort(
|
|
459
|
+
findTable(A, e, t) {
|
|
460
|
+
const r = this.bin.readUshort(A, t + 4);
|
|
510
461
|
let B = t + 12;
|
|
511
462
|
for (let E = 0; E < r; E++) {
|
|
512
|
-
const g = this.bin.readASCII(
|
|
513
|
-
if (g ===
|
|
463
|
+
const g = this.bin.readASCII(A, B, 4), i = this.bin.readUint(A, B + 8), o = this.bin.readUint(A, B + 12);
|
|
464
|
+
if (g === e)
|
|
514
465
|
return [i, o];
|
|
515
466
|
B += 16;
|
|
516
467
|
}
|
|
@@ -519,18 +470,18 @@ class Y {
|
|
|
519
470
|
/**
|
|
520
471
|
* Read font data from buffer
|
|
521
472
|
*/
|
|
522
|
-
readFont(
|
|
473
|
+
readFont(A, e, t) {
|
|
523
474
|
const r = {
|
|
524
|
-
_data:
|
|
525
|
-
_index:
|
|
475
|
+
_data: A,
|
|
476
|
+
_index: e,
|
|
526
477
|
_offset: t
|
|
527
478
|
}, B = /* @__PURE__ */ new Map(), E = ["cmap", "head", "hhea", "maxp", "hmtx"];
|
|
528
479
|
for (const g of E) {
|
|
529
|
-
const i = this.findTable(
|
|
480
|
+
const i = this.findTable(A, g, t);
|
|
530
481
|
if (i) {
|
|
531
482
|
const [o, n] = i;
|
|
532
483
|
let a = B.get(o);
|
|
533
|
-
a || (a = this.parseTable(g,
|
|
484
|
+
a || (a = this.parseTable(g, A, o, n, r), B.set(o, a)), r[g] = a;
|
|
534
485
|
}
|
|
535
486
|
}
|
|
536
487
|
return r;
|
|
@@ -538,27 +489,27 @@ class Y {
|
|
|
538
489
|
/**
|
|
539
490
|
* Parse a specific table
|
|
540
491
|
*/
|
|
541
|
-
parseTable(
|
|
542
|
-
switch (
|
|
492
|
+
parseTable(A, e, t, r, B) {
|
|
493
|
+
switch (A) {
|
|
543
494
|
case "cmap":
|
|
544
|
-
return this.parseCmapTable(
|
|
495
|
+
return this.parseCmapTable(e, t, r);
|
|
545
496
|
case "head":
|
|
546
|
-
return this.parseHeadTable(
|
|
497
|
+
return this.parseHeadTable(e, t, r);
|
|
547
498
|
case "hhea":
|
|
548
|
-
return this.parseHheaTable(
|
|
499
|
+
return this.parseHheaTable(e, t, r);
|
|
549
500
|
case "hmtx":
|
|
550
|
-
return this.parseHmtxTable(
|
|
501
|
+
return this.parseHmtxTable(e, t, r, B);
|
|
551
502
|
case "maxp":
|
|
552
|
-
return this.parseMaxpTable(
|
|
503
|
+
return this.parseMaxpTable(e, t, r);
|
|
553
504
|
default:
|
|
554
|
-
throw new Error(`Unknown table: ${
|
|
505
|
+
throw new Error(`Unknown table: ${A}`);
|
|
555
506
|
}
|
|
556
507
|
}
|
|
557
508
|
/**
|
|
558
509
|
* Parse cmap table
|
|
559
510
|
*/
|
|
560
|
-
parseCmapTable(
|
|
561
|
-
const r = new Uint8Array(
|
|
511
|
+
parseCmapTable(A, e, t) {
|
|
512
|
+
const r = new Uint8Array(A.buffer, e, t);
|
|
562
513
|
let B = 0;
|
|
563
514
|
B += 2;
|
|
564
515
|
const E = this.bin.readUshort(r, B);
|
|
@@ -566,7 +517,7 @@ class Y {
|
|
|
566
517
|
const g = {
|
|
567
518
|
tables: [],
|
|
568
519
|
ids: {},
|
|
569
|
-
off:
|
|
520
|
+
off: e
|
|
570
521
|
}, i = /* @__PURE__ */ new Set();
|
|
571
522
|
for (let o = 0; o < E; o++) {
|
|
572
523
|
const n = this.bin.readUshort(r, B);
|
|
@@ -575,29 +526,29 @@ class Y {
|
|
|
575
526
|
B += 2;
|
|
576
527
|
const h = this.bin.readUint(r, B);
|
|
577
528
|
B += 4;
|
|
578
|
-
const
|
|
529
|
+
const u = `p${n}e${a}`;
|
|
579
530
|
if (!i.has(h)) {
|
|
580
531
|
const x = this.bin.readUshort(r, h), v = this.parseCmapSubtable(r, h, x);
|
|
581
532
|
g.tables.push(v), i.add(h);
|
|
582
533
|
}
|
|
583
|
-
g.ids[
|
|
534
|
+
g.ids[u] = Array.from(i).indexOf(h);
|
|
584
535
|
}
|
|
585
536
|
return g;
|
|
586
537
|
}
|
|
587
538
|
/**
|
|
588
539
|
* Parse cmap subtable based on format
|
|
589
540
|
*/
|
|
590
|
-
parseCmapSubtable(
|
|
541
|
+
parseCmapSubtable(A, e, t) {
|
|
591
542
|
const r = { format: t };
|
|
592
543
|
switch (t) {
|
|
593
544
|
case 0:
|
|
594
|
-
return this.parseCmapFormat0(
|
|
545
|
+
return this.parseCmapFormat0(A, e, r);
|
|
595
546
|
case 4:
|
|
596
|
-
return this.parseCmapFormat4(
|
|
547
|
+
return this.parseCmapFormat4(A, e, r);
|
|
597
548
|
case 6:
|
|
598
|
-
return this.parseCmapFormat6(
|
|
549
|
+
return this.parseCmapFormat6(A, e, r);
|
|
599
550
|
case 12:
|
|
600
|
-
return this.parseCmapFormat12(
|
|
551
|
+
return this.parseCmapFormat12(A, e, r);
|
|
601
552
|
default:
|
|
602
553
|
return r;
|
|
603
554
|
}
|
|
@@ -605,81 +556,81 @@ class Y {
|
|
|
605
556
|
/**
|
|
606
557
|
* Parse cmap format 0
|
|
607
558
|
*/
|
|
608
|
-
parseCmapFormat0(
|
|
609
|
-
let r =
|
|
610
|
-
const B = this.bin.readUshort(
|
|
559
|
+
parseCmapFormat0(A, e, t) {
|
|
560
|
+
let r = e + 2;
|
|
561
|
+
const B = this.bin.readUshort(A, r);
|
|
611
562
|
r += 2, r += 2, t.map = [];
|
|
612
563
|
for (let E = 0; E < B - 6; E++)
|
|
613
|
-
t.map.push(
|
|
564
|
+
t.map.push(A[r + E]);
|
|
614
565
|
return t;
|
|
615
566
|
}
|
|
616
567
|
/**
|
|
617
568
|
* Parse cmap format 4
|
|
618
569
|
*/
|
|
619
|
-
parseCmapFormat4(
|
|
620
|
-
const r =
|
|
621
|
-
let B =
|
|
622
|
-
const E = this.bin.readUshort(
|
|
570
|
+
parseCmapFormat4(A, e, t) {
|
|
571
|
+
const r = e;
|
|
572
|
+
let B = e + 2;
|
|
573
|
+
const E = this.bin.readUshort(A, B);
|
|
623
574
|
B += 2, B += 2;
|
|
624
|
-
const g = this.bin.readUshort(
|
|
575
|
+
const g = this.bin.readUshort(A, B);
|
|
625
576
|
B += 2;
|
|
626
577
|
const i = g >>> 1;
|
|
627
|
-
t.searchRange = this.bin.readUshort(
|
|
578
|
+
t.searchRange = this.bin.readUshort(A, B), B += 2, t.entrySelector = this.bin.readUshort(A, B), B += 2, t.rangeShift = this.bin.readUshort(A, B), B += 2, t.endCount = this.bin.readUshorts(A, B, i), B += i * 2, B += 2, t.startCount = this.bin.readUshorts(A, B, i), B += i * 2, t.idDelta = [];
|
|
628
579
|
for (let o = 0; o < i; o++)
|
|
629
|
-
t.idDelta.push(this.bin.readShort(
|
|
630
|
-
return t.idRangeOffset = this.bin.readUshorts(
|
|
580
|
+
t.idDelta.push(this.bin.readShort(A, B)), B += 2;
|
|
581
|
+
return t.idRangeOffset = this.bin.readUshorts(A, B, i), B += i * 2, t.glyphIdArray = this.bin.readUshorts(A, B, r + E - B >> 1), t;
|
|
631
582
|
}
|
|
632
583
|
/**
|
|
633
584
|
* Parse cmap format 6
|
|
634
585
|
*/
|
|
635
|
-
parseCmapFormat6(
|
|
636
|
-
let r =
|
|
637
|
-
r += 2, r += 2, t.firstCode = this.bin.readUshort(
|
|
638
|
-
const B = this.bin.readUshort(
|
|
586
|
+
parseCmapFormat6(A, e, t) {
|
|
587
|
+
let r = e + 2;
|
|
588
|
+
r += 2, r += 2, t.firstCode = this.bin.readUshort(A, r), r += 2;
|
|
589
|
+
const B = this.bin.readUshort(A, r);
|
|
639
590
|
r += 2, t.glyphIdArray = [];
|
|
640
591
|
for (let E = 0; E < B; E++)
|
|
641
|
-
t.glyphIdArray.push(this.bin.readUshort(
|
|
592
|
+
t.glyphIdArray.push(this.bin.readUshort(A, r)), r += 2;
|
|
642
593
|
return t;
|
|
643
594
|
}
|
|
644
595
|
/**
|
|
645
596
|
* Parse cmap format 12
|
|
646
597
|
*/
|
|
647
|
-
parseCmapFormat12(
|
|
648
|
-
let r =
|
|
598
|
+
parseCmapFormat12(A, e, t) {
|
|
599
|
+
let r = e + 4;
|
|
649
600
|
r += 4, r += 4;
|
|
650
|
-
const B = this.bin.readUint(
|
|
601
|
+
const B = this.bin.readUint(A, r) * 3;
|
|
651
602
|
r += 4, t.groups = new Uint32Array(B);
|
|
652
603
|
for (let E = 0; E < B; E += 3)
|
|
653
|
-
t.groups[E] = this.bin.readUint(
|
|
604
|
+
t.groups[E] = this.bin.readUint(A, r + (E << 2)), t.groups[E + 1] = this.bin.readUint(A, r + (E << 2) + 4), t.groups[E + 2] = this.bin.readUint(A, r + (E << 2) + 8);
|
|
654
605
|
return t;
|
|
655
606
|
}
|
|
656
607
|
/**
|
|
657
608
|
* Parse head table
|
|
658
609
|
*/
|
|
659
|
-
parseHeadTable(
|
|
660
|
-
let r =
|
|
610
|
+
parseHeadTable(A, e, t) {
|
|
611
|
+
let r = e;
|
|
661
612
|
return r += 4, {
|
|
662
|
-
fontRevision: this.bin.readFixed(
|
|
663
|
-
flags: this.bin.readUshort(
|
|
664
|
-
unitsPerEm: this.bin.readUshort(
|
|
665
|
-
created: this.bin.readUint64(
|
|
666
|
-
modified: this.bin.readUint64(
|
|
667
|
-
xMin: this.bin.readShort(
|
|
668
|
-
yMin: this.bin.readShort(
|
|
669
|
-
xMax: this.bin.readShort(
|
|
670
|
-
yMax: this.bin.readShort(
|
|
671
|
-
macStyle: this.bin.readUshort(
|
|
672
|
-
lowestRecPPEM: this.bin.readUshort(
|
|
673
|
-
fontDirectionHint: this.bin.readShort(
|
|
674
|
-
indexToLocFormat: this.bin.readShort(
|
|
675
|
-
glyphDataFormat: this.bin.readShort(
|
|
613
|
+
fontRevision: this.bin.readFixed(A, r + 0),
|
|
614
|
+
flags: this.bin.readUshort(A, r + 8),
|
|
615
|
+
unitsPerEm: this.bin.readUshort(A, r + 10),
|
|
616
|
+
created: this.bin.readUint64(A, r + 12),
|
|
617
|
+
modified: this.bin.readUint64(A, r + 20),
|
|
618
|
+
xMin: this.bin.readShort(A, r + 28),
|
|
619
|
+
yMin: this.bin.readShort(A, r + 30),
|
|
620
|
+
xMax: this.bin.readShort(A, r + 32),
|
|
621
|
+
yMax: this.bin.readShort(A, r + 34),
|
|
622
|
+
macStyle: this.bin.readUshort(A, r + 36),
|
|
623
|
+
lowestRecPPEM: this.bin.readUshort(A, r + 38),
|
|
624
|
+
fontDirectionHint: this.bin.readShort(A, r + 40),
|
|
625
|
+
indexToLocFormat: this.bin.readShort(A, r + 42),
|
|
626
|
+
glyphDataFormat: this.bin.readShort(A, r + 44)
|
|
676
627
|
};
|
|
677
628
|
}
|
|
678
629
|
/**
|
|
679
630
|
* Parse hhea table
|
|
680
631
|
*/
|
|
681
|
-
parseHheaTable(
|
|
682
|
-
let r =
|
|
632
|
+
parseHheaTable(A, e, t) {
|
|
633
|
+
let r = e;
|
|
683
634
|
r += 4;
|
|
684
635
|
const B = [
|
|
685
636
|
"ascender",
|
|
@@ -701,18 +652,18 @@ class Y {
|
|
|
701
652
|
], E = {};
|
|
702
653
|
for (let g = 0; g < B.length; g++) {
|
|
703
654
|
const i = B[g], n = i === "advanceWidthMax" || i === "numberOfHMetrics" ? this.bin.readUshort : this.bin.readShort;
|
|
704
|
-
E[i] = n(
|
|
655
|
+
E[i] = n(A, r + g * 2);
|
|
705
656
|
}
|
|
706
657
|
return E;
|
|
707
658
|
}
|
|
708
659
|
/**
|
|
709
660
|
* Parse hmtx table
|
|
710
661
|
*/
|
|
711
|
-
parseHmtxTable(
|
|
662
|
+
parseHmtxTable(A, e, t, r) {
|
|
712
663
|
const B = r.maxp.numGlyphs, E = r.hhea.numberOfHMetrics, g = [], i = [];
|
|
713
|
-
let o =
|
|
664
|
+
let o = e, n = 0, a = 0;
|
|
714
665
|
for (let h = 0; h < E; h++)
|
|
715
|
-
n = this.bin.readUshort(
|
|
666
|
+
n = this.bin.readUshort(A, o), a = this.bin.readShort(A, o + 2), g.push(n), i.push(a), o += 4;
|
|
716
667
|
for (let h = E; h < B; h++)
|
|
717
668
|
g.push(n), i.push(a);
|
|
718
669
|
return { aWidth: g, lsBearing: i };
|
|
@@ -720,29 +671,29 @@ class Y {
|
|
|
720
671
|
/**
|
|
721
672
|
* Parse maxp table
|
|
722
673
|
*/
|
|
723
|
-
parseMaxpTable(
|
|
724
|
-
let r =
|
|
674
|
+
parseMaxpTable(A, e, t) {
|
|
675
|
+
let r = e;
|
|
725
676
|
r += 4;
|
|
726
|
-
const B = this.bin.readUshort(
|
|
677
|
+
const B = this.bin.readUshort(A, r);
|
|
727
678
|
return r += 2, { numGlyphs: B };
|
|
728
679
|
}
|
|
729
680
|
/**
|
|
730
681
|
* Create optimized binary reader
|
|
731
682
|
*/
|
|
732
683
|
createBinaryReader() {
|
|
733
|
-
const
|
|
734
|
-
buff:
|
|
735
|
-
int8: new Int8Array(
|
|
736
|
-
uint8: new Uint8Array(
|
|
737
|
-
int16: new Int16Array(
|
|
738
|
-
uint16: new Uint16Array(
|
|
739
|
-
int32: new Int32Array(
|
|
740
|
-
uint32: new Uint32Array(
|
|
684
|
+
const A = new ArrayBuffer(8), e = {
|
|
685
|
+
buff: A,
|
|
686
|
+
int8: new Int8Array(A),
|
|
687
|
+
uint8: new Uint8Array(A),
|
|
688
|
+
int16: new Int16Array(A),
|
|
689
|
+
uint16: new Uint16Array(A),
|
|
690
|
+
int32: new Int32Array(A),
|
|
691
|
+
uint32: new Uint32Array(A)
|
|
741
692
|
};
|
|
742
693
|
return {
|
|
743
694
|
readFixed: (t, r) => (t[r] << 8 | t[r + 1]) + (t[r + 2] << 8 | t[r + 3]) / (256 * 256 + 4),
|
|
744
|
-
readInt: (t, r) => (
|
|
745
|
-
readShort: (t, r) => (
|
|
695
|
+
readInt: (t, r) => (e.uint8[0] = t[r + 3], e.uint8[1] = t[r + 2], e.uint8[2] = t[r + 1], e.uint8[3] = t[r], e.int32[0]),
|
|
696
|
+
readShort: (t, r) => (e.uint16[0] = t[r] << 8 | t[r + 1], e.int16[0]),
|
|
746
697
|
readUshort: (t, r) => t[r] << 8 | t[r + 1],
|
|
747
698
|
readUshorts: (t, r, B) => {
|
|
748
699
|
const E = new Array(B);
|
|
@@ -750,9 +701,9 @@ class Y {
|
|
|
750
701
|
E[g] = t[r + g * 2] << 8 | t[r + g * 2 + 1];
|
|
751
702
|
return E;
|
|
752
703
|
},
|
|
753
|
-
readUint: (t, r) => (
|
|
704
|
+
readUint: (t, r) => (e.uint8[3] = t[r], e.uint8[2] = t[r + 1], e.uint8[1] = t[r + 2], e.uint8[0] = t[r + 3], e.uint32[0]),
|
|
754
705
|
readUint64: (t, r) => {
|
|
755
|
-
const B =
|
|
706
|
+
const B = e.uint32[0] = t[r] << 24 | t[r + 1] << 16 | t[r + 2] << 8 | t[r + 3], E = e.uint32[0] = t[r + 4] << 24 | t[r + 5] << 16 | t[r + 6] << 8 | t[r + 7];
|
|
756
707
|
return B * 4294967296 + E;
|
|
757
708
|
},
|
|
758
709
|
readASCII: (t, r, B) => {
|
|
@@ -761,13 +712,13 @@ class Y {
|
|
|
761
712
|
E += String.fromCharCode(t[r + g]);
|
|
762
713
|
return E;
|
|
763
714
|
},
|
|
764
|
-
t:
|
|
715
|
+
t: e
|
|
765
716
|
};
|
|
766
717
|
}
|
|
767
718
|
}
|
|
768
719
|
const w = new Y(), m = {
|
|
769
720
|
parse: (s) => w.parse(s),
|
|
770
|
-
findTable: (s,
|
|
721
|
+
findTable: (s, A, e) => w.findTable(s, A, e)
|
|
771
722
|
}, S = `data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAABAAAgAQAAIAEAACABAAAAAQAAIAEAAAABAAAAAQAAIAEAAGABAAAAAQAAAAEAAAABAAAAAQAAIAEAACABAAAAAQAAIAEAACABAAAAAQAAIAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAEABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAACAAQAAIAEAAAABAAAAAQAAAAEAACABAABAAQAAQAEAAEABAABAAQAAIAEAACABAAAAAQAAAAEAAAABAABAAQAAAAEAACABAAAAAQAAAAEAAIABAAAgAQAAAAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAAABAABgAQAAAAEAAGABAABgAQAAYAEAAAABAAAAAQAAAAEAAAABAABgAQAAYAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAGABAABgAQAAAAEAAAABAABgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAYAEAAAABAAAAAQAAQAEAACABAAAAAQAAAAEAAAABAAAgAQAAIAEAACABAAAgAQAAIAEAAAABAABAAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAAAAAIAAAADAAAAFAADAAEAAASaAAQEhgAAAJ4AgAAGAB4AfgCjAKUApwCsALIAtwC9AL8AxwDJANEA1gDcAOIA7wD0APcA/AD/AZIDkwOYA6MDpgOpA7EDtQPAA8QDxiAiIDwgfyCnIZUhqCIaIh8iKSJIImEiZSMCIxAjISUAJQIlDCUQJRQlGCUcJSQlLCU0JTwlbCWAJYQliCWMJZMloSWsJbIluiW8JcQlyyXZJjwmQCZCJmAmYyZmJmv//wAAACAAoQClAKcAqgCwALUAugC/AMQAyQDRANYA3ADfAOQA8QD2APkA/wGSA5MDmAOjA6YDqQOxA7QDwAPDA8YgIiA8IH8gpyGQIagiGSIeIikiSCJhImQjAiMQIyAlACUCJQwlECUUJRglHCUkJSwlNCU8JVAlgCWEJYgljCWQJaAlrCWyJbolvCXEJcsl2CY6JkAmQiZgJmMmZSZq////4v/A/7//vv+8/7n/t/+1/7T/sP+v/6j/pP+f/53/nP+b/5r/mf+X/wX9Bf0B/Pf89fzz/Oz86vzg/N783eCC4GngJ+AA3xjfBt6W3pPeit5s3lTeUt223andmtu827vbstuv26zbqdum25/bmNuR24rbd9tk22HbXttb21jbTNtC2z3bNts12y7bKNsc2rzaudq42pvamdqY2pUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEhgAAAJ4AgAAGAB4AfgCjAKUApwCsALIAtwC9AL8AxwDJANEA1gDcAOIA7wD0APcA/AD/AZIDkwOYA6MDpgOpA7EDtQPAA8QDxiAiIDwgfyCnIZUhqCIaIh8iKSJIImEiZSMCIxAjISUAJQIlDCUQJRQlGCUcJSQlLCU0JTwlbCWAJYQliCWMJZMloSWsJbIluiW8JcQlyyXZJjwmQCZCJmAmYyZmJmv//wAAACAAoQClAKcAqgCwALUAugC/AMQAyQDRANYA3ADfAOQA8QD2APkA/wGSA5MDmAOjA6YDqQOxA7QDwAPDA8YgIiA8IH8gpyGQIagiGSIeIikiSCJhImQjAiMQIyAlACUCJQwlECUUJRglHCUkJSwlNCU8JVAlgCWEJYgljCWQJaAlrCWyJbolvCXEJcsl2CY6JkAmQiZgJmMmZSZq////4v/A/7//vv+8/7n/t/+1/7T/sP+v/6j/pP+f/53/nP+b/5r/mf+X/wX9Bf0B/Pf89fzz/Oz86vzg/N783eCC4GngJ+AA3xjfBt6W3pPeit5s3lTeUt223andmtu827vbstuv26zbqdum25/bmNuR24rbd9tk22HbXttb21jbTNtC2z3bNts12y7bKNsc2rzaudq42pvamdqY2pUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAABwAAABIAAAAegAAALwAAADuAAAA9wAAARQAAAExAAABWgAAAW0AAAF7AAABhAAAAY0AAAGvAAAB0gAAAecAAAIOAAACNQAAAk8AAAJsAAACjgAAAqYAAALOAAAC5gAAAvQAAAMHAAADLgAAAzwAAANjAAADhQAAA6UAAAPCAAAD4AAAA/0AAAQaAAAEPAAABEwAAARrAAAEfgAABJEAAASpAAAE0AAABNsAAAT4AAAFFQAABS0AAAVDAAAFZQAABYcAAAWuAAAFvAAABc8AAAXnAAAGBAAABisAAAZDAAAGZQAABnMAAAaVAAAGowAABsUAAAbOAAAG3gAABvYAAAcMAAAHKQAABz8AAAdaAAAHbQAAB4oAAAedAAAHqwAAB8MAAAfgAAAH7gAACAsAAAgjAAAIOwAACFEAAAhsAAAIfAAACJkAAAi2AAAIzgAACOYAAAkDAAAJKgAACUIAAAlfAAAJfAAACYUAAAmiAAAJugAACdcAAAngAAAKBwAACi4AAApgAAAKeQAACokAAAq4AAAKwQAACs8AAArYAAAK8QAACw4AAAshAAALSAAAC1gAAAt1AAALjQAAC5sAAAu0AAALzQAAC9YAAAvhAAAL6gAAC/4AAAwRAAAMJAAADDQAAAxHAAAMUgAADGoAAAyCAAAMlwAADKUAAAy/AAAM0gAADN0AAAz8AAANDwAADSkAAA0yAAANTAAADVUAAA1jAAANfAAADYcAAA2VAAANqQAADcIAAA3mAAAN7wAADg4AAA4XAAAOQQAADloAAA5qAAAOcwAADoYAAA6PAAAOogAADrIAAA7FAAAPCwAADxsAAA8uAAAPRwAAD1AAAA+HAAAPoAAAD6kAAA/CAAAP3wAAD/wAABAZAAAQNgAAEE4AABBfAAAQlQAAEJ4AABCxAAAQugAAEOEAABEnAAARUwAAEWYAABF+AAARlgAAEbgAABJrAAASfgAAEpEAABKpAAASwQAAEswAABLcAAATCAAAExMAABMrAAATQwAAE1sAABNzAAATmgAAE8YAABPeAAAT5wAAE/AAABQSAAAUKgAAFEIAABRaAAAUYwAAFGwAABSOAAAUngAAFLsAABTYAAAU/wAAFSEAABVNAAAVZQAAFX0AABWVAAAVngAAFacAABXTAAAWBAAAFg0AABYvAAAWOgAAFkUAABZxAAAWhAAAFpIAABagAAAWrgAAFrwAABbVAAAW7QAAFxkAABd0AAAXzwAAF/wAABgUAAAYJQAAGC4AABhBAAAYXgAAGHEAABiYAAAYvAAAGOAAABkYAAAZPwAAGWYAABmNAAAZtAAAGdYAABn9AAAaEAAAGi0AAIBgACAAoAEAAADAAcAAAEBAQEBAQEBAYABAAAA/wAAAAEAAAD/AAQAAAD+AAAA/4AAAP8AAAAAAgEAAoADgAQAAAMABwAAAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8ABAAAAP6AAAABgAAA/oAAAAACAIAAgAQAA4AAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAABAAAAAIAAAP+AAAAAgAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAA/4AAAACAAQAAAACAAAADgAAA/4AAAACAAAD/gAAA/4AAAP8AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAABAAAAAIAAAP+A/wAAAAEAAAMAgACABAAEAAAbAB8AIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAABAAAAAIAAAP+AAAD/AAAA/4AAAP8AAAABAAAA/wAAAP+AAAAAgAAAAQD/gAAAAIAAAACAAAAAgAAABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAABQCAAIAEAAOAAAUAHQAjACkALwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAA/4AAAP+AAgABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACA/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
|
|
772
723
|
`;
|
|
773
724
|
class O {
|
|
@@ -776,58 +727,58 @@ class O {
|
|
|
776
727
|
* @param font The parsed font object from Typr
|
|
777
728
|
* @returns Array of unique character strings
|
|
778
729
|
*/
|
|
779
|
-
extractCharacters(
|
|
730
|
+
extractCharacters(A) {
|
|
780
731
|
var t;
|
|
781
|
-
const
|
|
782
|
-
return (t =
|
|
732
|
+
const e = [];
|
|
733
|
+
return (t = A == null ? void 0 : A.cmap) != null && t.tables ? (A.cmap.tables.forEach((r) => {
|
|
783
734
|
if (r.format === 4) {
|
|
784
735
|
const B = this._extractCharactersFromFormat4Table(r);
|
|
785
|
-
|
|
736
|
+
e.push(...B);
|
|
786
737
|
} else if (r.format === 12) {
|
|
787
738
|
const B = this._extractCharactersFromFormat12Table(r);
|
|
788
|
-
|
|
739
|
+
e.push(...B);
|
|
789
740
|
}
|
|
790
|
-
}), [...new Set(
|
|
741
|
+
}), [...new Set(e)]) : [];
|
|
791
742
|
}
|
|
792
743
|
/**
|
|
793
744
|
* Extracts characters from a Format 4 cmap table (Basic Multilingual Plane).
|
|
794
745
|
* @param table The Format 4 cmap table
|
|
795
746
|
* @returns Array of character strings
|
|
796
747
|
*/
|
|
797
|
-
_extractCharactersFromFormat4Table(
|
|
798
|
-
const
|
|
799
|
-
if (!
|
|
800
|
-
return
|
|
801
|
-
for (let t = 0; t <
|
|
802
|
-
const r =
|
|
748
|
+
_extractCharactersFromFormat4Table(A) {
|
|
749
|
+
const e = [];
|
|
750
|
+
if (!A.startCount || !A.endCount || !A.idRangeOffset || !A.idDelta)
|
|
751
|
+
return e;
|
|
752
|
+
for (let t = 0; t < A.startCount.length; t++) {
|
|
753
|
+
const r = A.startCount[t], B = A.endCount[t];
|
|
803
754
|
if (!(r === 65535 && B === 65535)) {
|
|
804
755
|
for (let E = r; E <= B; E++)
|
|
805
|
-
if (this._calculateGlyphIndexFormat4(
|
|
756
|
+
if (this._calculateGlyphIndexFormat4(A, E, t) > 0) {
|
|
806
757
|
const i = String.fromCodePoint(E);
|
|
807
|
-
|
|
758
|
+
e.push(i);
|
|
808
759
|
}
|
|
809
760
|
}
|
|
810
761
|
}
|
|
811
|
-
return
|
|
762
|
+
return e;
|
|
812
763
|
}
|
|
813
764
|
/**
|
|
814
765
|
* Extracts characters from a Format 12 cmap table (Extended Unicode ranges).
|
|
815
766
|
* @param table The Format 12 cmap table
|
|
816
767
|
* @returns Array of character strings
|
|
817
768
|
*/
|
|
818
|
-
_extractCharactersFromFormat12Table(
|
|
819
|
-
const
|
|
820
|
-
if (!
|
|
821
|
-
return
|
|
822
|
-
for (let t = 0; t <
|
|
823
|
-
const r =
|
|
769
|
+
_extractCharactersFromFormat12Table(A) {
|
|
770
|
+
const e = [];
|
|
771
|
+
if (!A.groups)
|
|
772
|
+
return e;
|
|
773
|
+
for (let t = 0; t < A.groups.length; t += 3) {
|
|
774
|
+
const r = A.groups[t], B = A.groups[t + 1], E = A.groups[t + 2];
|
|
824
775
|
for (let g = r; g <= B; g++)
|
|
825
776
|
if (E + (g - r) > 0) {
|
|
826
777
|
const o = String.fromCodePoint(g);
|
|
827
|
-
|
|
778
|
+
e.push(o);
|
|
828
779
|
}
|
|
829
780
|
}
|
|
830
|
-
return
|
|
781
|
+
return e;
|
|
831
782
|
}
|
|
832
783
|
/**
|
|
833
784
|
* Calculates the glyph index for a character in a Format 4 cmap table.
|
|
@@ -836,15 +787,15 @@ class O {
|
|
|
836
787
|
* @param rangeIndex The index of the character range
|
|
837
788
|
* @returns The glyph index, or 0 if not found
|
|
838
789
|
*/
|
|
839
|
-
_calculateGlyphIndexFormat4(
|
|
840
|
-
if (
|
|
841
|
-
return
|
|
790
|
+
_calculateGlyphIndexFormat4(A, e, t) {
|
|
791
|
+
if (A.idRangeOffset[t] === 0)
|
|
792
|
+
return e + A.idDelta[t] & 65535;
|
|
842
793
|
{
|
|
843
|
-
const r =
|
|
844
|
-
if (r >= 0 &&
|
|
845
|
-
const B =
|
|
794
|
+
const r = A.idRangeOffset[t] / 2 + (e - A.startCount[t]) - (A.startCount.length - t);
|
|
795
|
+
if (r >= 0 && A.glyphIdArray && r < A.glyphIdArray.length) {
|
|
796
|
+
const B = A.glyphIdArray[r];
|
|
846
797
|
if (B !== 0)
|
|
847
|
-
return B +
|
|
798
|
+
return B + A.idDelta[t] & 65535;
|
|
848
799
|
}
|
|
849
800
|
}
|
|
850
801
|
return 0;
|
|
@@ -854,29 +805,29 @@ class O {
|
|
|
854
805
|
* @param characters Array of character strings to filter
|
|
855
806
|
* @returns Filtered array of character strings
|
|
856
807
|
*/
|
|
857
|
-
filterProblematicCharacters(
|
|
858
|
-
return
|
|
808
|
+
filterProblematicCharacters(A) {
|
|
809
|
+
return A.filter((e) => this._isValidCharacter(e));
|
|
859
810
|
}
|
|
860
811
|
/**
|
|
861
812
|
* Checks if a character is valid for rendering.
|
|
862
813
|
* @param char The character to check
|
|
863
814
|
* @returns True if the character is valid, false otherwise
|
|
864
815
|
*/
|
|
865
|
-
_isValidCharacter(
|
|
866
|
-
const
|
|
867
|
-
return !(
|
|
816
|
+
_isValidCharacter(A) {
|
|
817
|
+
const e = A.codePointAt(0) || 0;
|
|
818
|
+
return !(e >= 0 && e <= 31 && e !== 9 && e !== 10 && e !== 13 || e >= 127 && e <= 159);
|
|
868
819
|
}
|
|
869
820
|
}
|
|
870
|
-
class
|
|
821
|
+
class z {
|
|
871
822
|
/**
|
|
872
823
|
* Creates a new TextureAtlasCreation instance.
|
|
873
824
|
* @param renderer The WebGL renderer instance
|
|
874
825
|
*/
|
|
875
|
-
constructor(
|
|
826
|
+
constructor(A) {
|
|
876
827
|
Q(this, "_textureCanvas");
|
|
877
828
|
Q(this, "_textureContext");
|
|
878
829
|
Q(this, "_renderer");
|
|
879
|
-
this._renderer =
|
|
830
|
+
this._renderer = A, this._textureCanvas = document.createElement("canvas"), this._textureContext = this._textureCanvas.getContext("2d", { willReadFrequently: !0 });
|
|
880
831
|
}
|
|
881
832
|
/**
|
|
882
833
|
* Creates a texture atlas from the given characters.
|
|
@@ -886,9 +837,9 @@ class H {
|
|
|
886
837
|
* @param fontFamilyName Font family name to use
|
|
887
838
|
* @returns Object containing framebuffer, columns, and rows
|
|
888
839
|
*/
|
|
889
|
-
async createTextureAtlas(
|
|
890
|
-
const B =
|
|
891
|
-
this._setupCanvas(i, o, t, r), this._renderCharactersToCanvas(
|
|
840
|
+
async createTextureAtlas(A, e, t, r) {
|
|
841
|
+
const B = A.length, E = Math.ceil(Math.sqrt(B)), g = Math.ceil(B / E), i = e.width * E, o = e.height * g;
|
|
842
|
+
this._setupCanvas(i, o, t, r), this._renderCharactersToCanvas(A, e, E, t), this._applyBlackWhiteThreshold();
|
|
892
843
|
const n = this._renderer.createFramebuffer(i, o, { filter: "nearest" });
|
|
893
844
|
return n.update(this._textureCanvas), {
|
|
894
845
|
framebuffer: n,
|
|
@@ -903,8 +854,8 @@ class H {
|
|
|
903
854
|
* @param fontSize Font size
|
|
904
855
|
* @param fontFamilyName Font family name
|
|
905
856
|
*/
|
|
906
|
-
_setupCanvas(
|
|
907
|
-
this._textureCanvas.width =
|
|
857
|
+
_setupCanvas(A, e, t, r) {
|
|
858
|
+
this._textureCanvas.width = A, this._textureCanvas.height = e, this._textureContext.imageSmoothingEnabled = !0, this._textureContext.imageSmoothingQuality = "high", this._textureContext.fillStyle = "black", this._textureContext.fillRect(0, 0, A, e), this._textureContext.font = `${t}px ${r}`, this._textureContext.textBaseline = "top", this._textureContext.textAlign = "left", this._textureContext.fillStyle = "white";
|
|
908
859
|
}
|
|
909
860
|
/**
|
|
910
861
|
* Renders all characters to the canvas in a grid layout.
|
|
@@ -913,10 +864,10 @@ class H {
|
|
|
913
864
|
* @param textureColumns Number of columns in the texture
|
|
914
865
|
* @param fontSize Font size
|
|
915
866
|
*/
|
|
916
|
-
_renderCharactersToCanvas(
|
|
917
|
-
for (let B = 0; B <
|
|
918
|
-
const E = B % t, g = Math.floor(B / t), i = E *
|
|
919
|
-
this._textureContext.fillText(
|
|
867
|
+
_renderCharactersToCanvas(A, e, t, r) {
|
|
868
|
+
for (let B = 0; B < A.length; B++) {
|
|
869
|
+
const E = B % t, g = Math.floor(B / t), i = E * e.width + e.width / 2, o = g * e.height + e.height / 2, n = i - e.width / 2, a = o - r / 2;
|
|
870
|
+
this._textureContext.fillText(A[B].character, n, a);
|
|
920
871
|
}
|
|
921
872
|
}
|
|
922
873
|
/**
|
|
@@ -925,16 +876,16 @@ class H {
|
|
|
925
876
|
* ensuring crisp text rendering suitable for NEAREST texture filtering.
|
|
926
877
|
* @param threshold Threshold value (0-255) for black/white conversion
|
|
927
878
|
*/
|
|
928
|
-
_applyBlackWhiteThreshold(
|
|
929
|
-
const
|
|
879
|
+
_applyBlackWhiteThreshold(A = 128) {
|
|
880
|
+
const e = this._textureContext.getImageData(0, 0, this._textureCanvas.width, this._textureCanvas.height), t = e.data;
|
|
930
881
|
for (let r = 0; r < t.length; r += 4) {
|
|
931
|
-
const E = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2] >
|
|
882
|
+
const E = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2] > A ? 255 : 0;
|
|
932
883
|
t[r] = E, t[r + 1] = E, t[r + 2] = E;
|
|
933
884
|
}
|
|
934
|
-
this._textureContext.putImageData(
|
|
885
|
+
this._textureContext.putImageData(e, 0, 0);
|
|
935
886
|
}
|
|
936
887
|
}
|
|
937
|
-
class
|
|
888
|
+
class H {
|
|
938
889
|
/**
|
|
939
890
|
* Creates a new MetricsCalculation instance.
|
|
940
891
|
*/
|
|
@@ -951,10 +902,10 @@ class z {
|
|
|
951
902
|
* @param fontFace FontFace object (optional, for validation)
|
|
952
903
|
* @returns Object containing width and height dimensions
|
|
953
904
|
*/
|
|
954
|
-
calculateMaxGlyphDimensions(
|
|
955
|
-
this._tempContext.font = `${
|
|
905
|
+
calculateMaxGlyphDimensions(A, e, t) {
|
|
906
|
+
this._tempContext.font = `${e}px ${t}`;
|
|
956
907
|
let r = 0, B = 0;
|
|
957
|
-
for (const E of
|
|
908
|
+
for (const E of A) {
|
|
958
909
|
const g = this._tempContext.measureText(E), i = g.width, o = g.actualBoundingBoxAscent + g.actualBoundingBoxDescent;
|
|
959
910
|
i > 0 && (r = Math.max(r, i), B = Math.max(B, o));
|
|
960
911
|
}
|
|
@@ -970,11 +921,11 @@ class L {
|
|
|
970
921
|
* @param characters Array of character strings
|
|
971
922
|
* @returns Array of TextmodeCharacter objects with colors
|
|
972
923
|
*/
|
|
973
|
-
createCharacterObjects(
|
|
974
|
-
return
|
|
975
|
-
const r =
|
|
924
|
+
createCharacterObjects(A) {
|
|
925
|
+
return A.map((e, t) => {
|
|
926
|
+
const r = e.codePointAt(0) || 0, B = this._generateCharacterColor(t);
|
|
976
927
|
return {
|
|
977
|
-
character:
|
|
928
|
+
character: e,
|
|
978
929
|
unicode: r,
|
|
979
930
|
color: B
|
|
980
931
|
};
|
|
@@ -985,9 +936,9 @@ class L {
|
|
|
985
936
|
* @param index The index of the character
|
|
986
937
|
* @returns RGB color as a tuple [r, g, b]
|
|
987
938
|
*/
|
|
988
|
-
_generateCharacterColor(
|
|
989
|
-
const
|
|
990
|
-
return [
|
|
939
|
+
_generateCharacterColor(A) {
|
|
940
|
+
const e = A % 256, t = Math.floor(A / 256) % 256, r = Math.floor(A / 65536) % 256;
|
|
941
|
+
return [e, t, r];
|
|
991
942
|
}
|
|
992
943
|
/**
|
|
993
944
|
* Gets the color for a specific character.
|
|
@@ -995,8 +946,8 @@ class L {
|
|
|
995
946
|
* @param characters Array of TextmodeCharacter objects
|
|
996
947
|
* @returns RGB color as a tuple [r, g, b], or [0, 0, 0] if not found
|
|
997
948
|
*/
|
|
998
|
-
getCharacterColor(
|
|
999
|
-
const t =
|
|
949
|
+
getCharacterColor(A, e) {
|
|
950
|
+
const t = e.find((r) => r.character === A);
|
|
1000
951
|
return t ? t.color : [0, 0, 0];
|
|
1001
952
|
}
|
|
1002
953
|
/**
|
|
@@ -1005,18 +956,18 @@ class L {
|
|
|
1005
956
|
* @param characters Array of TextmodeCharacter objects
|
|
1006
957
|
* @returns Array of RGB colors for each character
|
|
1007
958
|
*/
|
|
1008
|
-
getCharacterColors(
|
|
1009
|
-
return
|
|
959
|
+
getCharacterColors(A, e) {
|
|
960
|
+
return A.split("").map((t) => this.getCharacterColor(t, e) || [0, 0, 0]);
|
|
1010
961
|
}
|
|
1011
962
|
}
|
|
1012
|
-
class
|
|
963
|
+
class k {
|
|
1013
964
|
/**
|
|
1014
965
|
* Creates a new TextmodeFont instance.
|
|
1015
966
|
* @param renderer Renderer instance for texture creation
|
|
1016
967
|
* @param fontSize Font size to use for the texture atlas
|
|
1017
968
|
* @ignore
|
|
1018
969
|
*/
|
|
1019
|
-
constructor(
|
|
970
|
+
constructor(A, e = 16) {
|
|
1020
971
|
Q(this, "_font");
|
|
1021
972
|
Q(this, "_characters", []);
|
|
1022
973
|
Q(this, "_fontFramebuffer");
|
|
@@ -1031,7 +982,7 @@ class V {
|
|
|
1031
982
|
Q(this, "_textureAtlas");
|
|
1032
983
|
Q(this, "_metricsCalculator");
|
|
1033
984
|
Q(this, "_characterColorMapper");
|
|
1034
|
-
this._fontSize =
|
|
985
|
+
this._fontSize = e, this._characterExtractor = new O(), this._textureAtlas = new z(A), this._metricsCalculator = new H(), this._characterColorMapper = new L();
|
|
1035
986
|
}
|
|
1036
987
|
/**
|
|
1037
988
|
* Initializes the font manager by loading the font and creating the texture atlas.
|
|
@@ -1039,8 +990,8 @@ class V {
|
|
|
1039
990
|
* @ignore
|
|
1040
991
|
*/
|
|
1041
992
|
async initialize() {
|
|
1042
|
-
const
|
|
1043
|
-
await this._loadFontFace(
|
|
993
|
+
const e = await (await fetch(S)).arrayBuffer();
|
|
994
|
+
await this._loadFontFace(e), this._font = m.parse(e)[0], await this._initializeFont();
|
|
1044
995
|
}
|
|
1045
996
|
/**
|
|
1046
997
|
* Loads a new font from a file path.
|
|
@@ -1048,36 +999,36 @@ class V {
|
|
|
1048
999
|
* @returns Promise that resolves when font loading is complete
|
|
1049
1000
|
* @ignore
|
|
1050
1001
|
*/
|
|
1051
|
-
async loadFont(
|
|
1002
|
+
async loadFont(A) {
|
|
1052
1003
|
try {
|
|
1053
|
-
const
|
|
1054
|
-
if (!
|
|
1055
|
-
throw new
|
|
1056
|
-
const t = await
|
|
1004
|
+
const e = await fetch(A);
|
|
1005
|
+
if (!e.ok)
|
|
1006
|
+
throw new D(`Failed to load font file: ${e.status} ${e.statusText}`);
|
|
1007
|
+
const t = await e.arrayBuffer();
|
|
1057
1008
|
await this._loadFontFace(t);
|
|
1058
1009
|
const r = m.parse(t);
|
|
1059
1010
|
if (!r || r.length === 0)
|
|
1060
1011
|
throw new Error("Failed to parse font file");
|
|
1061
1012
|
this._font = r[0], await this._initializeFont();
|
|
1062
|
-
} catch (
|
|
1063
|
-
throw new
|
|
1013
|
+
} catch (e) {
|
|
1014
|
+
throw new D(`Failed to load font: ${e instanceof Error ? e.message : "Unknown error"}`, e);
|
|
1064
1015
|
}
|
|
1065
1016
|
}
|
|
1066
1017
|
/**
|
|
1067
1018
|
* Loads a FontFace from a font buffer.
|
|
1068
1019
|
* @param fontBuffer ArrayBuffer containing font data
|
|
1069
1020
|
*/
|
|
1070
|
-
async _loadFontFace(
|
|
1071
|
-
const
|
|
1072
|
-
this._fontFamilyName = this._fontFamilyName === "UrsaFont" ? "UrsaFont" : `CustomFont_${
|
|
1021
|
+
async _loadFontFace(A) {
|
|
1022
|
+
const e = Date.now();
|
|
1023
|
+
this._fontFamilyName = this._fontFamilyName === "UrsaFont" ? "UrsaFont" : `CustomFont_${e}`, this._fontFace = new FontFace(this._fontFamilyName, A), await this._fontFace.load(), document.fonts.add(this._fontFace);
|
|
1073
1024
|
}
|
|
1074
1025
|
/**
|
|
1075
1026
|
* Initializes all font-dependent properties using the component classes.
|
|
1076
1027
|
*/
|
|
1077
1028
|
async _initializeFont() {
|
|
1078
|
-
const
|
|
1079
|
-
this._characters = this._characterColorMapper.createCharacterObjects(
|
|
1080
|
-
|
|
1029
|
+
const A = this._characterExtractor.extractCharacters(this._font), e = this._characterExtractor.filterProblematicCharacters(A);
|
|
1030
|
+
this._characters = this._characterColorMapper.createCharacterObjects(e), this._maxGlyphDimensions = this._metricsCalculator.calculateMaxGlyphDimensions(
|
|
1031
|
+
e,
|
|
1081
1032
|
this._fontSize,
|
|
1082
1033
|
this._fontFamilyName
|
|
1083
1034
|
);
|
|
@@ -1094,12 +1045,12 @@ class V {
|
|
|
1094
1045
|
* @param character The character to get the color for.
|
|
1095
1046
|
* @returns The RGB color as an array `[r, g, b]`.
|
|
1096
1047
|
*/
|
|
1097
|
-
getCharacterColor(
|
|
1048
|
+
getCharacterColor(A) {
|
|
1098
1049
|
return C.validate(
|
|
1099
|
-
typeof
|
|
1050
|
+
typeof A == "string" && A.length === 1,
|
|
1100
1051
|
"Character must be a single character string.",
|
|
1101
|
-
{ providedValue:
|
|
1102
|
-
) ? this._characterColorMapper.getCharacterColor(
|
|
1052
|
+
{ providedValue: A, method: "getCharacterColor" }
|
|
1053
|
+
) ? this._characterColorMapper.getCharacterColor(A, this._characters) : [0, 0, 0];
|
|
1103
1054
|
}
|
|
1104
1055
|
/**
|
|
1105
1056
|
* Get the colors associated with a string of characters.
|
|
@@ -1107,23 +1058,23 @@ class V {
|
|
|
1107
1058
|
* @returns An array of RGB colors for each character in the string.
|
|
1108
1059
|
* Each color is represented as an array `[r, g, b]`.
|
|
1109
1060
|
*/
|
|
1110
|
-
getCharacterColors(
|
|
1061
|
+
getCharacterColors(A) {
|
|
1111
1062
|
return C.validate(
|
|
1112
|
-
typeof
|
|
1063
|
+
typeof A == "string" && A.length > 0,
|
|
1113
1064
|
"Characters must be a string with at least one character.",
|
|
1114
|
-
{ providedValue:
|
|
1115
|
-
) ? this._characterColorMapper.getCharacterColors(
|
|
1065
|
+
{ providedValue: A, method: "getCharacterColors" }
|
|
1066
|
+
) ? this._characterColorMapper.getCharacterColors(A, this._characters) : [[0, 0, 0]];
|
|
1116
1067
|
}
|
|
1117
1068
|
/**
|
|
1118
1069
|
* Checks if all characters in the given string exist in the font.
|
|
1119
1070
|
* @param str The string to check.
|
|
1120
1071
|
* @returns `true` if all characters exist in the font, `false` otherwise.
|
|
1121
1072
|
*/
|
|
1122
|
-
hasAllCharacters(
|
|
1123
|
-
if (typeof
|
|
1124
|
-
const
|
|
1125
|
-
for (const t of
|
|
1126
|
-
if (!
|
|
1073
|
+
hasAllCharacters(A) {
|
|
1074
|
+
if (typeof A != "string" || A.length === 0) return !1;
|
|
1075
|
+
const e = new Set(this._characters.map((t) => t.character));
|
|
1076
|
+
for (const t of A)
|
|
1077
|
+
if (!e.has(t)) return !1;
|
|
1127
1078
|
return !0;
|
|
1128
1079
|
}
|
|
1129
1080
|
/**
|
|
@@ -1139,7 +1090,7 @@ class V {
|
|
|
1139
1090
|
}
|
|
1140
1091
|
/** Returns a string representation of all characters in the font. */
|
|
1141
1092
|
get charactersString() {
|
|
1142
|
-
return this._characters.map((
|
|
1093
|
+
return this._characters.map((A) => A.character).join("");
|
|
1143
1094
|
}
|
|
1144
1095
|
/** Returns the number of columns in the texture atlas. */
|
|
1145
1096
|
get textureColumns() {
|
|
@@ -1158,7 +1109,7 @@ class V {
|
|
|
1158
1109
|
return this._fontSize;
|
|
1159
1110
|
}
|
|
1160
1111
|
}
|
|
1161
|
-
class
|
|
1112
|
+
class N {
|
|
1162
1113
|
/**
|
|
1163
1114
|
* Create a new grid instance.
|
|
1164
1115
|
* @param canvas The canvas element used to determine the grid dimensions.
|
|
@@ -1166,7 +1117,7 @@ class k {
|
|
|
1166
1117
|
* @param cellHeight The height of each cell in the grid.
|
|
1167
1118
|
* @ignore
|
|
1168
1119
|
*/
|
|
1169
|
-
constructor(
|
|
1120
|
+
constructor(A, e, t) {
|
|
1170
1121
|
/** The number of columns in the grid. */
|
|
1171
1122
|
Q(this, "_cols");
|
|
1172
1123
|
/** The number of rows in the grid. */
|
|
@@ -1187,7 +1138,7 @@ class k {
|
|
|
1187
1138
|
Q(this, "_cellWidth");
|
|
1188
1139
|
/** The height of each cell in the grid. */
|
|
1189
1140
|
Q(this, "_cellHeight");
|
|
1190
|
-
this._canvas =
|
|
1141
|
+
this._canvas = A, this._cellWidth = e, this._cellHeight = t, this.reset();
|
|
1191
1142
|
}
|
|
1192
1143
|
/**
|
|
1193
1144
|
* Reset the grid to the default number of columns and rows based on the current canvas dimensions, and the grid cell dimensions.
|
|
@@ -1208,8 +1159,8 @@ class k {
|
|
|
1208
1159
|
* @param newCellHeight The new cell height.
|
|
1209
1160
|
* @ignore
|
|
1210
1161
|
*/
|
|
1211
|
-
resizeCellPixelDimensions(
|
|
1212
|
-
[this._cellWidth, this._cellHeight] = [
|
|
1162
|
+
resizeCellPixelDimensions(A, e) {
|
|
1163
|
+
[this._cellWidth, this._cellHeight] = [A, e], this.reset();
|
|
1213
1164
|
}
|
|
1214
1165
|
/**
|
|
1215
1166
|
* Re-assign the grid dimensions and resize the grid.
|
|
@@ -1219,8 +1170,8 @@ class k {
|
|
|
1219
1170
|
* @param newRows The new number of rows.
|
|
1220
1171
|
* @ignore
|
|
1221
1172
|
*/
|
|
1222
|
-
resizeGridDimensions(
|
|
1223
|
-
this._fixedDimensions = !0, [this._cols, this._rows] = [
|
|
1173
|
+
resizeGridDimensions(A, e) {
|
|
1174
|
+
this._fixedDimensions = !0, [this._cols, this._rows] = [A, e], this._resizeGrid();
|
|
1224
1175
|
}
|
|
1225
1176
|
/**
|
|
1226
1177
|
* Make the grid dimensions flexible again, and `reset()` the grid.
|
|
@@ -1234,8 +1185,8 @@ class k {
|
|
|
1234
1185
|
* @param canvas The new canvas element to use for the grid.
|
|
1235
1186
|
* @ignore
|
|
1236
1187
|
*/
|
|
1237
|
-
|
|
1238
|
-
this.
|
|
1188
|
+
resize() {
|
|
1189
|
+
this._fixedDimensions ? this._resizeGrid() : this.reset();
|
|
1239
1190
|
}
|
|
1240
1191
|
/**
|
|
1241
1192
|
* Gets or sets whether the grid dimensions *(columns and rows)* are fixed or responsive based on the canvas dimensions.
|
|
@@ -1243,10 +1194,10 @@ class k {
|
|
|
1243
1194
|
* @returns If no parameter is provided, returns `true` if the grid dimensions are fixed, or `false` if they are responsive.
|
|
1244
1195
|
* @ignore
|
|
1245
1196
|
*/
|
|
1246
|
-
fixedDimensions(
|
|
1247
|
-
if (
|
|
1197
|
+
fixedDimensions(A) {
|
|
1198
|
+
if (A === void 0)
|
|
1248
1199
|
return this._fixedDimensions;
|
|
1249
|
-
this._fixedDimensions =
|
|
1200
|
+
this._fixedDimensions = A;
|
|
1250
1201
|
}
|
|
1251
1202
|
/** Returns the width of each cell in the grid. */
|
|
1252
1203
|
get cellWidth() {
|
|
@@ -1281,47 +1232,47 @@ class k {
|
|
|
1281
1232
|
return this._offsetY;
|
|
1282
1233
|
}
|
|
1283
1234
|
}
|
|
1284
|
-
class
|
|
1285
|
-
constructor(
|
|
1235
|
+
class V {
|
|
1236
|
+
constructor(A) {
|
|
1286
1237
|
Q(this, "webglCanvas");
|
|
1287
1238
|
Q(this, "captureCanvas");
|
|
1288
|
-
this.captureCanvas =
|
|
1239
|
+
this.captureCanvas = A, this.webglCanvas = this.createOverlayCanvas();
|
|
1289
1240
|
}
|
|
1290
1241
|
generateUniqueCanvasId() {
|
|
1291
|
-
let
|
|
1292
|
-
for (; document.getElementById(
|
|
1293
|
-
|
|
1294
|
-
return
|
|
1242
|
+
let A = 0, e = `textmodeCanvas${A}`;
|
|
1243
|
+
for (; document.getElementById(e); )
|
|
1244
|
+
A++, e = `textmodeCanvas${A}`;
|
|
1245
|
+
return e;
|
|
1295
1246
|
}
|
|
1296
1247
|
createOverlayCanvas() {
|
|
1297
1248
|
var B;
|
|
1298
|
-
const
|
|
1299
|
-
|
|
1300
|
-
const
|
|
1301
|
-
let t = parseInt(
|
|
1302
|
-
isNaN(t) && (t = 0),
|
|
1249
|
+
const A = document.createElement("canvas");
|
|
1250
|
+
A.width = this.captureCanvas.width, A.height = this.captureCanvas.height, A.className = "textmodeCanvas", A.id = this.generateUniqueCanvasId(), A.style.position = "absolute", A.style.pointerEvents = "none";
|
|
1251
|
+
const e = window.getComputedStyle(this.captureCanvas);
|
|
1252
|
+
let t = parseInt(e.zIndex || "0", 10);
|
|
1253
|
+
isNaN(t) && (t = 0), A.style.zIndex = (t + 1).toString();
|
|
1303
1254
|
const r = this.captureCanvas.getBoundingClientRect();
|
|
1304
|
-
return
|
|
1255
|
+
return A.style.width = r.width + "px", A.style.height = r.height + "px", this.positionOverlayCanvas(A), (B = this.captureCanvas.parentNode) == null || B.insertBefore(A, this.captureCanvas.nextSibling), A;
|
|
1305
1256
|
}
|
|
1306
|
-
positionOverlayCanvas(
|
|
1307
|
-
const
|
|
1257
|
+
positionOverlayCanvas(A) {
|
|
1258
|
+
const e = this.captureCanvas.getBoundingClientRect();
|
|
1308
1259
|
let t = this.captureCanvas.offsetParent;
|
|
1309
1260
|
if (t && t !== document.body) {
|
|
1310
1261
|
const r = t.getBoundingClientRect();
|
|
1311
|
-
|
|
1262
|
+
A.style.top = e.top - r.top + "px", A.style.left = e.left - r.left + "px";
|
|
1312
1263
|
} else
|
|
1313
|
-
|
|
1264
|
+
A.style.top = e.top + window.scrollY + "px", A.style.left = e.left + window.scrollX + "px";
|
|
1314
1265
|
}
|
|
1315
1266
|
resize() {
|
|
1316
1267
|
this.webglCanvas.width = this.captureCanvas.width, this.webglCanvas.height = this.captureCanvas.height;
|
|
1317
|
-
const
|
|
1318
|
-
this.webglCanvas.style.width =
|
|
1268
|
+
const A = this.captureCanvas.getBoundingClientRect();
|
|
1269
|
+
this.webglCanvas.style.width = A.width + "px", this.webglCanvas.style.height = A.height + "px", this.positionOverlayCanvas(this.webglCanvas);
|
|
1319
1270
|
}
|
|
1320
1271
|
/**
|
|
1321
1272
|
* Get the WebGL context for the overlay canvas
|
|
1322
1273
|
*/
|
|
1323
1274
|
getWebGLContext() {
|
|
1324
|
-
const
|
|
1275
|
+
const A = {
|
|
1325
1276
|
alpha: !0,
|
|
1326
1277
|
premultipliedAlpha: !1,
|
|
1327
1278
|
preserveDrawingBuffer: !0,
|
|
@@ -1329,10 +1280,10 @@ class N {
|
|
|
1329
1280
|
depth: !1,
|
|
1330
1281
|
stencil: !1,
|
|
1331
1282
|
powerPreference: "high-performance"
|
|
1332
|
-
},
|
|
1333
|
-
if (!
|
|
1334
|
-
throw new
|
|
1335
|
-
return
|
|
1283
|
+
}, e = this.webglCanvas.getContext("webgl2", A) || this.webglCanvas.getContext("webgl", A);
|
|
1284
|
+
if (!e)
|
|
1285
|
+
throw new D("WebGL context could not be created. Ensure your browser supports WebGL.");
|
|
1286
|
+
return e;
|
|
1336
1287
|
}
|
|
1337
1288
|
// Getters
|
|
1338
1289
|
get canvas() {
|
|
@@ -1346,7 +1297,7 @@ class N {
|
|
|
1346
1297
|
}
|
|
1347
1298
|
}
|
|
1348
1299
|
class p {
|
|
1349
|
-
constructor(
|
|
1300
|
+
constructor(A, e, t, r = {}) {
|
|
1350
1301
|
Q(this, "renderer");
|
|
1351
1302
|
Q(this, "fontManager");
|
|
1352
1303
|
Q(this, "grid");
|
|
@@ -1356,7 +1307,7 @@ class p {
|
|
|
1356
1307
|
Q(this, "_rotationFramebuffer");
|
|
1357
1308
|
Q(this, "_transformFramebuffer");
|
|
1358
1309
|
Q(this, "options");
|
|
1359
|
-
this.renderer =
|
|
1310
|
+
this.renderer = A, this.fontManager = e, this.grid = t, this.options = r, this._characterFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._primaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._rotationFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._transformFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1360
1311
|
}
|
|
1361
1312
|
/**
|
|
1362
1313
|
* Resizes all internal framebuffers to match the grid dimensions.
|
|
@@ -1387,12 +1338,12 @@ class J {
|
|
|
1387
1338
|
* @param renderer The renderer instance.
|
|
1388
1339
|
* @param colors The RGB colors to store as [r, g, b] arrays where values are 0-255.
|
|
1389
1340
|
*/
|
|
1390
|
-
constructor(
|
|
1341
|
+
constructor(A, e) {
|
|
1391
1342
|
/** The framebuffer used to store the color palette. */
|
|
1392
1343
|
Q(this, "_framebuffer");
|
|
1393
1344
|
Q(this, "_renderer");
|
|
1394
1345
|
Q(this, "_colors");
|
|
1395
|
-
this._renderer =
|
|
1346
|
+
this._renderer = A, this._colors = e;
|
|
1396
1347
|
const t = Math.max(this._colors.length, 1);
|
|
1397
1348
|
this._framebuffer = this._renderer.createFramebuffer(t, 1), this._updateFramebuffer();
|
|
1398
1349
|
}
|
|
@@ -1401,21 +1352,21 @@ class J {
|
|
|
1401
1352
|
*/
|
|
1402
1353
|
_updateFramebuffer() {
|
|
1403
1354
|
if (!this._framebuffer) return;
|
|
1404
|
-
const
|
|
1405
|
-
this._framebuffer.width !==
|
|
1406
|
-
const t = new Uint8Array(
|
|
1407
|
-
for (let r = 0; r <
|
|
1355
|
+
const A = Math.max(this._colors.length, 1), e = 1;
|
|
1356
|
+
this._framebuffer.width !== A && this._framebuffer.resize(A, e);
|
|
1357
|
+
const t = new Uint8Array(A * e * 4);
|
|
1358
|
+
for (let r = 0; r < A; r++) {
|
|
1408
1359
|
const B = r < this._colors.length ? this._colors[r] : [0, 0, 0], E = r * 4;
|
|
1409
1360
|
t[E] = B[0], t[E + 1] = B[1], t[E + 2] = B[2], t[E + 3] = 255;
|
|
1410
1361
|
}
|
|
1411
|
-
this._framebuffer.
|
|
1362
|
+
this._framebuffer.updatePixels(t, A, e);
|
|
1412
1363
|
}
|
|
1413
1364
|
/**
|
|
1414
1365
|
* Sets the colors of the palette and updates the framebuffer.
|
|
1415
1366
|
* @param newColors The new RGB colors to set as [r, g, b] arrays.
|
|
1416
1367
|
*/
|
|
1417
|
-
setColors(
|
|
1418
|
-
this._colors =
|
|
1368
|
+
setColors(A) {
|
|
1369
|
+
this._colors = A, this._updateFramebuffer();
|
|
1419
1370
|
}
|
|
1420
1371
|
/**
|
|
1421
1372
|
* Get the colors of the palette.
|
|
@@ -1437,8 +1388,8 @@ class J {
|
|
|
1437
1388
|
}
|
|
1438
1389
|
}
|
|
1439
1390
|
class _ extends p {
|
|
1440
|
-
constructor(
|
|
1441
|
-
super(
|
|
1391
|
+
constructor(e, t, r, B = {}) {
|
|
1392
|
+
super(e, t, r, B);
|
|
1442
1393
|
Q(this, "palette");
|
|
1443
1394
|
this.palette = new J(this.renderer, this.fontManager.getCharacterColors(" .:-=+*%@#"));
|
|
1444
1395
|
}
|
|
@@ -1446,12 +1397,12 @@ class _ extends p {
|
|
|
1446
1397
|
* Sets the characters used for brightness mapping.
|
|
1447
1398
|
* @param characters The characters to use for brightness mapping, ordered from darkest to brightest.
|
|
1448
1399
|
*/
|
|
1449
|
-
characters(
|
|
1400
|
+
characters(e) {
|
|
1450
1401
|
C.validate(
|
|
1451
|
-
this.fontManager.hasAllCharacters(
|
|
1402
|
+
this.fontManager.hasAllCharacters(e),
|
|
1452
1403
|
"One or more characters do not exist in the current font.",
|
|
1453
|
-
{ method: "characters", providedValue:
|
|
1454
|
-
) && (this.options.characters =
|
|
1404
|
+
{ method: "characters", providedValue: e }
|
|
1405
|
+
) && (this.options.characters = e, this.palette.setColors(this.fontManager.getCharacterColors(e)));
|
|
1455
1406
|
}
|
|
1456
1407
|
/**
|
|
1457
1408
|
* Sets a fixed color for characters if `characterColorMode` is `fixed`.
|
|
@@ -1460,12 +1411,12 @@ class _ extends p {
|
|
|
1460
1411
|
* @param b Blue component (0-255).
|
|
1461
1412
|
* @param a Alpha component (0-255).
|
|
1462
1413
|
*/
|
|
1463
|
-
characterColor(
|
|
1414
|
+
characterColor(e, t = e, r = e, B = 255) {
|
|
1464
1415
|
C.validate(
|
|
1465
|
-
[
|
|
1416
|
+
[e, t, r, B].every((E) => E >= 0 && E <= 255),
|
|
1466
1417
|
"Character color values must be between 0 and 255",
|
|
1467
|
-
{ method: "characterColor", providedValues: { r:
|
|
1468
|
-
) && (this.options.characterColor = [
|
|
1418
|
+
{ method: "characterColor", providedValues: { r: e, g: t, b: r, a: B } }
|
|
1419
|
+
) && (this.options.characterColor = [e, t, r, B]);
|
|
1469
1420
|
}
|
|
1470
1421
|
/**
|
|
1471
1422
|
* Sets the character color mode.
|
|
@@ -1473,12 +1424,12 @@ class _ extends p {
|
|
|
1473
1424
|
* - `'fixed'`: Uses a fixed color set by `characterColor()`.
|
|
1474
1425
|
* @param mode The color mode to use for characters.
|
|
1475
1426
|
*/
|
|
1476
|
-
characterColorMode(
|
|
1427
|
+
characterColorMode(e) {
|
|
1477
1428
|
C.validate(
|
|
1478
|
-
["sampled", "fixed"].includes(
|
|
1429
|
+
["sampled", "fixed"].includes(e),
|
|
1479
1430
|
"Invalid character color mode. Must be 'sampled' or 'fixed'.",
|
|
1480
|
-
{ method: "characterColorMode", providedValue:
|
|
1481
|
-
) && (this.options.characterColorMode =
|
|
1431
|
+
{ method: "characterColorMode", providedValue: e }
|
|
1432
|
+
) && (this.options.characterColorMode = e);
|
|
1482
1433
|
}
|
|
1483
1434
|
/**
|
|
1484
1435
|
* Sets the cell color if `backgroundColorMode` is `fixed`.
|
|
@@ -1487,12 +1438,12 @@ class _ extends p {
|
|
|
1487
1438
|
* @param b Blue component (0-255).
|
|
1488
1439
|
* @param a Alpha component (0-255).
|
|
1489
1440
|
*/
|
|
1490
|
-
cellColor(
|
|
1441
|
+
cellColor(e, t = e, r = e, B = 255) {
|
|
1491
1442
|
C.validate(
|
|
1492
|
-
[
|
|
1443
|
+
[e, t, r, B].every((E) => E >= 0 && E <= 255),
|
|
1493
1444
|
"Cell color values must be between 0 and 255",
|
|
1494
|
-
{ method: "cellColor", providedValues: { r:
|
|
1495
|
-
) && (this.options.backgroundColor = [
|
|
1445
|
+
{ method: "cellColor", providedValues: { r: e, g: t, b: r, a: B } }
|
|
1446
|
+
) && (this.options.backgroundColor = [e, t, r, B]);
|
|
1496
1447
|
}
|
|
1497
1448
|
/**
|
|
1498
1449
|
* Sets the background color mode.
|
|
@@ -1500,60 +1451,60 @@ class _ extends p {
|
|
|
1500
1451
|
* - `'fixed'`: Uses a fixed color set by `backgroundColor()`.
|
|
1501
1452
|
* @param mode The color mode to use for background cells.
|
|
1502
1453
|
*/
|
|
1503
|
-
cellColorMode(
|
|
1454
|
+
cellColorMode(e) {
|
|
1504
1455
|
C.validate(
|
|
1505
|
-
["sampled", "fixed"].includes(
|
|
1456
|
+
["sampled", "fixed"].includes(e),
|
|
1506
1457
|
"Invalid cell color mode. Must be 'sampled' or 'fixed'.",
|
|
1507
|
-
{ method: "cellColorMode", providedValue:
|
|
1508
|
-
) && (this.options.backgroundColorMode =
|
|
1458
|
+
{ method: "cellColorMode", providedValue: e }
|
|
1459
|
+
) && (this.options.backgroundColorMode = e);
|
|
1509
1460
|
}
|
|
1510
1461
|
/**
|
|
1511
1462
|
* Swaps the character and cell color.
|
|
1512
1463
|
* @param invert If `true`, the character color becomes the cell color and vice versa.
|
|
1513
1464
|
*/
|
|
1514
|
-
invert(
|
|
1465
|
+
invert(e) {
|
|
1515
1466
|
C.validate(
|
|
1516
|
-
typeof
|
|
1467
|
+
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1517
1468
|
"Invert must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1518
|
-
{ method: "invert", providedValue:
|
|
1519
|
-
) && (this.options.invert = !!
|
|
1469
|
+
{ method: "invert", providedValue: e }
|
|
1470
|
+
) && (this.options.invert = !!e);
|
|
1520
1471
|
}
|
|
1521
1472
|
/**
|
|
1522
1473
|
* Sets the rotation angle for the characters.
|
|
1523
1474
|
* @param angle The rotation angle in degrees.
|
|
1524
1475
|
*/
|
|
1525
|
-
rotation(
|
|
1476
|
+
rotation(e) {
|
|
1526
1477
|
C.validate(
|
|
1527
|
-
typeof
|
|
1478
|
+
typeof e == "number",
|
|
1528
1479
|
"Rotation angle must be a number.",
|
|
1529
|
-
{ method: "rotation", providedValue:
|
|
1530
|
-
) && (this.options.rotation =
|
|
1480
|
+
{ method: "rotation", providedValue: e }
|
|
1481
|
+
) && (this.options.rotation = e);
|
|
1531
1482
|
}
|
|
1532
1483
|
/**
|
|
1533
1484
|
* Flips the characters horizontally.
|
|
1534
1485
|
* @param flip If `true`, characters are flipped horizontally. If `false`, no flip is applied.
|
|
1535
1486
|
*/
|
|
1536
|
-
flipHorizontally(
|
|
1487
|
+
flipHorizontally(e) {
|
|
1537
1488
|
C.validate(
|
|
1538
|
-
typeof
|
|
1489
|
+
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1539
1490
|
"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1540
|
-
{ method: "flipHorizontally", providedValue:
|
|
1541
|
-
) && (this.options.flipHorizontally = !!
|
|
1491
|
+
{ method: "flipHorizontally", providedValue: e }
|
|
1492
|
+
) && (this.options.flipHorizontally = !!e);
|
|
1542
1493
|
}
|
|
1543
1494
|
/**
|
|
1544
1495
|
* Flips the characters vertically.
|
|
1545
1496
|
* @param flip If `true`, characters are flipped vertically. If `false`, no flip is applied.
|
|
1546
1497
|
*/
|
|
1547
|
-
flipVertically(
|
|
1498
|
+
flipVertically(e) {
|
|
1548
1499
|
C.validate(
|
|
1549
|
-
typeof
|
|
1500
|
+
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1550
1501
|
"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1551
|
-
{ method: "flipVertically", providedValue:
|
|
1552
|
-
) && (this.options.flipVertically = !!
|
|
1502
|
+
{ method: "flipVertically", providedValue: e }
|
|
1503
|
+
) && (this.options.flipVertically = !!e);
|
|
1553
1504
|
}
|
|
1554
1505
|
}
|
|
1555
|
-
var W = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;gl_FragColor=texture2D(u_sketchTexture,cellCenter);}",
|
|
1556
|
-
const
|
|
1506
|
+
var W = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;gl_FragColor=texture2D(u_sketchTexture,cellCenter);}", K = "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,color.a);}";
|
|
1507
|
+
const X = {
|
|
1557
1508
|
/** Enable/disable the renderer */
|
|
1558
1509
|
enabled: !0,
|
|
1559
1510
|
/** Characters used for brightness mapping (from darkest to brightest) */
|
|
@@ -1578,15 +1529,15 @@ const K = {
|
|
|
1578
1529
|
brightnessRange: [0, 255]
|
|
1579
1530
|
};
|
|
1580
1531
|
class b extends _ {
|
|
1581
|
-
constructor(
|
|
1582
|
-
super(
|
|
1532
|
+
constructor(e, t, r) {
|
|
1533
|
+
super(e, t, r, { ...X });
|
|
1583
1534
|
Q(this, "sampleShader");
|
|
1584
1535
|
Q(this, "charMappingShader");
|
|
1585
1536
|
Q(this, "sampleFramebuffer");
|
|
1586
|
-
this.sampleShader = new
|
|
1537
|
+
this.sampleShader = new l(e.context, P, W), this.charMappingShader = new l(e.context, P, K), this.sampleFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1587
1538
|
}
|
|
1588
|
-
convert(
|
|
1589
|
-
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture",
|
|
1539
|
+
convert(e) {
|
|
1540
|
+
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.rect(0, 0, this.grid.cols, this.grid.rows), this.sampleFramebuffer.end(), this._primaryColorFramebuffer.begin(), this.options.characterColorMode === "fixed" ? this.renderer.background(this.options.characterColor[0], this.options.characterColor[1], this.options.characterColor[2], this.options.characterColor[3]) : (this.renderer.clear(), this.renderer.image(this.sampleFramebuffer, 0, 0, this.grid.cols, this.grid.rows)), this._primaryColorFramebuffer.end(), this._secondaryColorFramebuffer.begin(), this.options.backgroundColorMode === "fixed" ? this.renderer.background(this.options.backgroundColor[0], this.options.backgroundColor[1], this.options.backgroundColor[2], this.options.backgroundColor[3]) : (this.renderer.clear(), this.renderer.image(this.sampleFramebuffer, 0, 0, this.grid.cols, this.grid.rows)), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.background(
|
|
1590
1541
|
this.options.invert ? 255 : 0,
|
|
1591
1542
|
this.options.flipHorizontally ? 255 : 0,
|
|
1592
1543
|
this.options.flipVertically ? 255 : 0
|
|
@@ -1602,12 +1553,12 @@ class b extends _ {
|
|
|
1602
1553
|
*
|
|
1603
1554
|
* @param range Array of two numbers `[min, max]`, where `min` is darkest and `max` is brightest.
|
|
1604
1555
|
*/
|
|
1605
|
-
brightnessRange(
|
|
1556
|
+
brightnessRange(e) {
|
|
1606
1557
|
C.validate(
|
|
1607
|
-
Array.isArray(
|
|
1558
|
+
Array.isArray(e) && e.length === 2 && e.every((t) => typeof t == "number" && t >= 0 && t <= 255),
|
|
1608
1559
|
"Brightness range must be an array of two numbers between 0 and 255.",
|
|
1609
|
-
{ method: "brightnessRange", providedValue:
|
|
1610
|
-
) && (this.options.brightnessRange =
|
|
1560
|
+
{ method: "brightnessRange", providedValue: e }
|
|
1561
|
+
) && (this.options.brightnessRange = e);
|
|
1611
1562
|
}
|
|
1612
1563
|
}
|
|
1613
1564
|
const q = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -1616,41 +1567,41 @@ const q = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
1616
1567
|
TextmodeConverter: p,
|
|
1617
1568
|
TextmodeFeatureConverter: _
|
|
1618
1569
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1619
|
-
var Z = "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;uniform float u_pixelRatio;
|
|
1570
|
+
var Z = "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;uniform float u_pixelRatio;void main(){vec2 logicalPos=gl_FragCoord.xy/u_pixelRatio;vec2 gridCoord=(logicalPos/u_gridPixelDimensions)*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 texCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,texCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,texCoord);vec4 transform=texture2D(u_transformTexture,texCoord);vec4 charData=texture2D(u_asciiCharacterTexture,texCoord);if(charData.a<0.01){gl_FragColor=u_backgroundMode==0 ? vec4(0.0):texture2D(u_captureTexture,logicalPos/u_captureDimensions);return;}int charIndex=int(charData.r*255.0+0.5)+int(charData.g*255.0+0.5)*256;vec2 charPos=vec2(mod(float(charIndex),u_charsetDimensions.x),floor(float(charIndex)/u_charsetDimensions.x))/u_charsetDimensions;vec4 rotation=texture2D(u_rotationTexture,texCoord);float angle=((rotation.r*255.0+rotation.g)*360.0/255.0)*0.017453293;vec2 frac=fract(gridCoord)-0.5;frac.x*=transform.g>0.5 ?-1.0 : 1.0;frac.y*=transform.b>0.5 ?-1.0 : 1.0;float s=sin(angle),c=cos(angle);frac=mat2(c,-s,s,c)*frac+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 finalTexCoord=charPos+frac*cellSize;if(any(lessThan(frac,vec2(0.0)))||any(greaterThan(frac,vec2(1.0)))){gl_FragColor=transform.r>0.5 ? primaryColor : secondaryColor;}else{vec4 charTexel=texture2D(u_characterTexture,finalTexCoord);float inv=transform.r>0.5 ? 1.0 : 0.0;charTexel.rgb=mix(charTexel.rgb,1.0-charTexel.rgb,inv);gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}}";
|
|
1620
1571
|
class j {
|
|
1621
|
-
constructor(
|
|
1572
|
+
constructor(A, e, t) {
|
|
1622
1573
|
Q(this, "renderer");
|
|
1623
1574
|
Q(this, "font");
|
|
1624
1575
|
Q(this, "grid");
|
|
1625
1576
|
Q(this, "converters");
|
|
1626
1577
|
Q(this, "_resultFramebuffer");
|
|
1627
1578
|
Q(this, "_asciiShader");
|
|
1628
|
-
this.renderer =
|
|
1629
|
-
brightness: new b(
|
|
1579
|
+
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(P, Z), this.converters = {
|
|
1580
|
+
brightness: new b(A, e, t)
|
|
1630
1581
|
}, this._resultFramebuffer = this.renderer.createFramebuffer(this.grid.width, this.grid.height);
|
|
1631
1582
|
}
|
|
1632
|
-
render(
|
|
1633
|
-
for (const
|
|
1634
|
-
|
|
1635
|
-
this._resultFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this._asciiShader), this.renderer.setUniform("u_characterTexture", this.font.fontFramebuffer), this.renderer.setUniform("u_charsetDimensions", [this.font.textureColumns, this.font.textureRows]), this.renderer.setUniform("u_asciiCharacterTexture", this.converters.brightness.characterFramebuffer.texture), this.renderer.setUniform("u_primaryColorTexture", this.converters.brightness.primaryColorFramebuffer.texture), this.renderer.setUniform("u_secondaryColorTexture", this.converters.brightness.secondaryColorFramebuffer.texture), this.renderer.setUniform("u_transformTexture", this.converters.brightness.transformFramebuffer.texture), this.renderer.setUniform("u_rotationTexture", this.converters.brightness.rotationFramebuffer.texture), this.renderer.setUniform("u_captureTexture",
|
|
1583
|
+
render(A) {
|
|
1584
|
+
for (const e of Object.values(this.converters))
|
|
1585
|
+
e.convert(A);
|
|
1586
|
+
this._resultFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this._asciiShader), this.renderer.setUniform("u_characterTexture", this.font.fontFramebuffer), this.renderer.setUniform("u_charsetDimensions", [this.font.textureColumns, this.font.textureRows]), this.renderer.setUniform("u_asciiCharacterTexture", this.converters.brightness.characterFramebuffer.texture), this.renderer.setUniform("u_primaryColorTexture", this.converters.brightness.primaryColorFramebuffer.texture), this.renderer.setUniform("u_secondaryColorTexture", this.converters.brightness.secondaryColorFramebuffer.texture), this.renderer.setUniform("u_transformTexture", this.converters.brightness.transformFramebuffer.texture), this.renderer.setUniform("u_rotationTexture", this.converters.brightness.rotationFramebuffer.texture), this.renderer.setUniform("u_captureTexture", A.texture), this.renderer.setUniform("u_backgroundMode", !1), this.renderer.setUniform("u_captureDimensions", [A.width, A.height]), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_gridPixelDimensions", [this.grid.width, this.grid.height]), this.renderer.setUniform("u_pixelRatio", 1), this.renderer.rect(0, 0, this._resultFramebuffer.width, this._resultFramebuffer.height), this._resultFramebuffer.end();
|
|
1636
1587
|
}
|
|
1637
|
-
get(
|
|
1638
|
-
const
|
|
1639
|
-
if (!
|
|
1640
|
-
throw new Error(`Converter "${
|
|
1641
|
-
return
|
|
1588
|
+
get(A) {
|
|
1589
|
+
const e = this.converters[A];
|
|
1590
|
+
if (!e)
|
|
1591
|
+
throw new Error(`Converter "${A}" not found in pipeline.`);
|
|
1592
|
+
return e;
|
|
1642
1593
|
}
|
|
1643
1594
|
get texture() {
|
|
1644
1595
|
return this._resultFramebuffer;
|
|
1645
1596
|
}
|
|
1646
1597
|
resize() {
|
|
1647
1598
|
this._resultFramebuffer.resize(this.grid.width, this.grid.height);
|
|
1648
|
-
for (const
|
|
1649
|
-
|
|
1599
|
+
for (const A of Object.values(this.converters))
|
|
1600
|
+
A.resize();
|
|
1650
1601
|
}
|
|
1651
1602
|
}
|
|
1652
|
-
class
|
|
1653
|
-
constructor(
|
|
1603
|
+
class f {
|
|
1604
|
+
constructor(A, e = {}) {
|
|
1654
1605
|
/** The canvas element to capture content from */
|
|
1655
1606
|
Q(this, "captureCanvas");
|
|
1656
1607
|
/** Our WebGL overlay canvas manager */
|
|
@@ -1670,7 +1621,7 @@ class d {
|
|
|
1670
1621
|
Q(this, "_frameRate", 0);
|
|
1671
1622
|
Q(this, "lastRenderTime", 0);
|
|
1672
1623
|
Q(this, "_pipeline");
|
|
1673
|
-
this.captureCanvas =
|
|
1624
|
+
this.captureCanvas = A, this.textmodeCanvas = new V(A), this._mode = e.renderMode ?? "auto", this._frameRateLimit = e.frameRate ?? 120, this.frameInterval = 1e3 / this._frameRateLimit, this.renderer = new R(this.textmodeCanvas.getWebGLContext()), this.canvasFramebuffer = this.renderer.createFramebuffer(A.width, A.height), this._font = new k(this.renderer, e.fontSize ?? 16);
|
|
1674
1625
|
}
|
|
1675
1626
|
/**
|
|
1676
1627
|
* Static factory method for creating and initializing a Textmodifier instance.
|
|
@@ -1678,11 +1629,11 @@ class d {
|
|
|
1678
1629
|
* @param opts Optional configuration options for the `Textmodifier` instance.
|
|
1679
1630
|
* @ignore
|
|
1680
1631
|
*/
|
|
1681
|
-
static async create(
|
|
1682
|
-
const t = new
|
|
1632
|
+
static async create(A, e = {}) {
|
|
1633
|
+
const t = new f(A, e);
|
|
1683
1634
|
await t._font.initialize();
|
|
1684
1635
|
const r = t._font.maxGlyphDimensions;
|
|
1685
|
-
return t._grid = new
|
|
1636
|
+
return t._grid = new N(t.captureCanvas, r.width, r.height), t._pipeline = new j(t.renderer, t._font, t._grid), t.setupEventListeners(), t.startAutoRendering(), t;
|
|
1686
1637
|
}
|
|
1687
1638
|
setupEventListeners() {
|
|
1688
1639
|
window.addEventListener("resize", this.resize.bind(this)), window.ResizeObserver && (this.resizeObserver = new ResizeObserver(() => {
|
|
@@ -1693,10 +1644,10 @@ class d {
|
|
|
1693
1644
|
* Update the font used for rendering.
|
|
1694
1645
|
* @param fontUrl The URL of the font to load.
|
|
1695
1646
|
*/
|
|
1696
|
-
async loadFont(
|
|
1697
|
-
return this._font.loadFont(
|
|
1698
|
-
const
|
|
1699
|
-
this._grid.resizeCellPixelDimensions(
|
|
1647
|
+
async loadFont(A) {
|
|
1648
|
+
return this._font.loadFont(A).then(() => {
|
|
1649
|
+
const e = this._font.maxGlyphDimensions;
|
|
1650
|
+
this._grid.resizeCellPixelDimensions(e.width, e.height), this._pipeline.resize();
|
|
1700
1651
|
});
|
|
1701
1652
|
}
|
|
1702
1653
|
/**
|
|
@@ -1709,28 +1660,28 @@ class d {
|
|
|
1709
1660
|
this.measureFrameRate(), this.canvasFramebuffer.update(this.captureCanvas), this._pipeline.render(this.canvasFramebuffer), this.renderer.background(0), this.renderer.image(this._pipeline.texture, this._grid.offsetX, this._grid.offsetY, this._pipeline.texture.width, this._pipeline.texture.height);
|
|
1710
1661
|
}
|
|
1711
1662
|
resize() {
|
|
1712
|
-
this.textmodeCanvas.resize(), this.canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this._grid.
|
|
1663
|
+
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();
|
|
1713
1664
|
}
|
|
1714
1665
|
/**
|
|
1715
1666
|
* Start automatic rendering
|
|
1716
1667
|
*/
|
|
1717
1668
|
startAutoRendering() {
|
|
1718
1669
|
if (this._mode !== "auto") return;
|
|
1719
|
-
const
|
|
1720
|
-
|
|
1670
|
+
const A = (e) => {
|
|
1671
|
+
e - this.lastFrameTime >= this.frameInterval && (this.render(), this.lastFrameTime = e), this.animationFrameId = requestAnimationFrame(A);
|
|
1721
1672
|
};
|
|
1722
|
-
this.animationFrameId = requestAnimationFrame(
|
|
1673
|
+
this.animationFrameId = requestAnimationFrame(A);
|
|
1723
1674
|
}
|
|
1724
1675
|
/**
|
|
1725
1676
|
* Update FPS measurement - works for both auto and manual modes
|
|
1726
1677
|
*/
|
|
1727
1678
|
measureFrameRate() {
|
|
1728
|
-
const
|
|
1679
|
+
const A = performance.now();
|
|
1729
1680
|
if (this.lastRenderTime > 0) {
|
|
1730
|
-
const
|
|
1731
|
-
this._frameRate = 1e3 /
|
|
1681
|
+
const e = A - this.lastRenderTime;
|
|
1682
|
+
this._frameRate = 1e3 / e;
|
|
1732
1683
|
}
|
|
1733
|
-
this.lastRenderTime =
|
|
1684
|
+
this.lastRenderTime = A;
|
|
1734
1685
|
}
|
|
1735
1686
|
/**
|
|
1736
1687
|
* Stop automatic rendering
|
|
@@ -1741,21 +1692,21 @@ class d {
|
|
|
1741
1692
|
/**
|
|
1742
1693
|
* Change the rendering mode.
|
|
1743
1694
|
*/
|
|
1744
|
-
renderMode(
|
|
1745
|
-
if (this._mode !==
|
|
1746
|
-
if (
|
|
1695
|
+
renderMode(A) {
|
|
1696
|
+
if (this._mode !== A) {
|
|
1697
|
+
if (A === void 0)
|
|
1747
1698
|
return this._mode;
|
|
1748
|
-
this.stopAutoRendering(), this._mode =
|
|
1699
|
+
this.stopAutoRendering(), this._mode = A, A === "auto" && this.startAutoRendering();
|
|
1749
1700
|
}
|
|
1750
1701
|
}
|
|
1751
1702
|
/**
|
|
1752
1703
|
* Set the maximum frame rate for auto rendering. If called without arguments, returns the current measured frame rate.
|
|
1753
1704
|
* @param fps The maximum frames per second for auto rendering.
|
|
1754
1705
|
*/
|
|
1755
|
-
frameRate(
|
|
1756
|
-
if (
|
|
1706
|
+
frameRate(A) {
|
|
1707
|
+
if (A === void 0)
|
|
1757
1708
|
return this._frameRate;
|
|
1758
|
-
this._frameRateLimit =
|
|
1709
|
+
this._frameRateLimit = A, this.frameInterval = 1e3 / A;
|
|
1759
1710
|
}
|
|
1760
1711
|
converter() {
|
|
1761
1712
|
return this._pipeline.get("brightness");
|
|
@@ -1777,22 +1728,22 @@ class d {
|
|
|
1777
1728
|
return this._pipeline;
|
|
1778
1729
|
}
|
|
1779
1730
|
}
|
|
1780
|
-
class
|
|
1731
|
+
class d {
|
|
1781
1732
|
/**
|
|
1782
1733
|
* Create a {@link Textmodifier} instance to apply textmode rendering to a given canvas.
|
|
1783
1734
|
* @param canvas The HTML canvas element to capture content from.
|
|
1784
1735
|
* @param opts Optional configuration options for the Textmodifier instance.
|
|
1785
1736
|
* @returns A Promise that resolves to a Textmodifier instance.
|
|
1786
1737
|
*/
|
|
1787
|
-
static async create(
|
|
1788
|
-
return
|
|
1738
|
+
static async create(A, e = {}) {
|
|
1739
|
+
return f.create(A, e);
|
|
1789
1740
|
}
|
|
1790
1741
|
/**
|
|
1791
1742
|
* Set the global error handling level for the library. This applies to all `Textmodifier` instances.
|
|
1792
1743
|
* @param level The error handling level to set.
|
|
1793
1744
|
*/
|
|
1794
|
-
static setErrorLevel(
|
|
1795
|
-
C.setGlobalLevel(
|
|
1745
|
+
static setErrorLevel(A) {
|
|
1746
|
+
C.setGlobalLevel(A);
|
|
1796
1747
|
}
|
|
1797
1748
|
/**
|
|
1798
1749
|
* The current version of the library.
|
|
@@ -1804,16 +1755,16 @@ class f {
|
|
|
1804
1755
|
throw new Error("Textmode is a static class and cannot be instantiated.");
|
|
1805
1756
|
}
|
|
1806
1757
|
}
|
|
1807
|
-
const AA =
|
|
1758
|
+
const AA = d.create, eA = d.setErrorLevel, tA = d.version;
|
|
1808
1759
|
export {
|
|
1809
|
-
|
|
1760
|
+
V as TextmodeCanvas,
|
|
1810
1761
|
q as TextmodeConverters,
|
|
1811
1762
|
T as TextmodeErrorLevel,
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1763
|
+
k as TextmodeFont,
|
|
1764
|
+
N as TextmodeGrid,
|
|
1765
|
+
f as Textmodifier,
|
|
1815
1766
|
AA as create,
|
|
1816
1767
|
eA as setErrorLevel,
|
|
1817
|
-
|
|
1768
|
+
d as textmode,
|
|
1818
1769
|
tA as version
|
|
1819
1770
|
};
|