egra: agg mini code cleanups
[iv.d.git] / egra / gfx / aggmini / core.d
blobbf5de77d5e7201c8f8e12b79da55fae89d94a685
1 /*
2 * Simple Framebuffer Gfx/GUI lib
4 * coded by Ketmar // Invisible Vector <ketmar@ketmar.no-ip.org>
5 * Understanding is not required. Only obedience.
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, version 3 of the License ONLY.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 /* *****************************************************************************
20 Anti-Grain Geometry - Version 2.1 Lite
21 Copyright (C) 2002-2003 Maxim Shemanarev (McSeem)
22 D port, additional work: Ketmar Dark
24 Permission to copy, use, modify, sell and distribute this software
25 is granted provided this copyright notice appears in all copies.
26 This software is provided "as is" without express or implied
27 warranty, and with no claim as to its suitability for any purpose.
29 The author gratefully acknowleges the support of David Turner,
30 Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
31 libray - in producing this work. See http://www.freetype.org for details.
33 Initially the rendering algorithm was designed by David Turner and the
34 other authors of the FreeType library - see the above notice. I nearly
35 created a similar renderer, but still I was far from David's work.
36 I completely redesigned the original code and adapted it for Anti-Grain
37 ideas. Two functions - renderLine and renderScanLine are the core of
38 the algorithm - they calculate the exact coverage of each pixel cell
39 of the polygon. I left these functions almost as is, because there's
40 no way to improve the perfection - hats off to David and his group!
42 All other code is very different from the original.
43 ***************************************************************************** */
44 module iv.egra.gfx.aggmini.core;
45 private:
46 //nothrow @safe @nogc:
48 private import iv.egra.gfx.aggmini : DisableCopyingMixin;
49 private import iv.egra.gfx.aggmini.enums;
50 private import iv.egra.gfx.aggmini.supmath;
51 private import iv.egra.gfx.aggmini.render;
52 private import iv.egra.gfx.aggmini.stroker;
54 private import iv.egra.gfx.base;
56 //debug private import iv.cmdcon;
58 //version = egra_aggmini_debug_rasta;
61 // ////////////////////////////////////////////////////////////////////////// //
62 // some "fastgfx" backend
63 public struct AGGDrawer {
64 protected:
65 // added vertex will contain "end poly" command only when `closePoly()`/`endPoly()` was called
66 static struct Vertex {
67 float x, y;
68 uint cmd; // path command
70 this (in float ax, in float ay, in uint acmd) pure nothrow @safe @nogc {
71 pragma(inline, true);
72 x = ax;
73 y = ay;
74 cmd = acmd;
78 protected:
79 Rasterizer rast;
80 SimpleVector!Vertex vtx; // reset by `beginPath()`
82 float lastStartX = 0.0f, lastStartY = 0.0f; // first point of the current poly
83 float lastX = 0.0f, lastY = 0.0f;
84 float utlastX = 0.0f, utlastY = 0.0f;
86 // for vertex producer
87 uint vpIdx;
89 // for rasterising vertex consumer
90 static struct ConsumerState {
91 float startX = 0.0f, startY = 0.0f;
92 float lastX = 0.0f, lastY = 0.0f;
93 uint lineCmdCount = 0;
94 // 0: poly just started
95 // 1: last command was "move to"
96 // 2 and more: number of sequential "line to" commands minus 1
98 ConsumerState rcsm;
101 AGGMatrix tmatrix;
102 bool dotransform = false;
104 public:
105 float tessTol = 0.25f;
106 float angleTol = 0.0f; // 0.0f -- angle tolerance for McSeem Bezier rasterizer
107 float cuspLimit = 0.0f; // 0 -- cusp limit for McSeem Bezier rasterizer (0: real cusps)
108 int bezierLimit = 20; // bezier recursion limit for non-AFD tesselators
110 // default tesselator for Bezier curves
111 AGGTesselation tesselator = AGGTesselation.DeCasteljauMcSeem;
112 //AGGTesselation tesselator = AGGTesselation.DeCasteljau;
113 //AGGTesselation tesselator = AGGTesselation.AFD;
115 mixin(DisableCopyingMixin);
117 public:
118 ref AGGDrawer withTransform(DG) (in auto ref AGGMatrix tmt, scope DG dg)
119 if (is(typeof((inout int=0) { DG vp = void; dg(); })))
121 immutable AGGMatrix old = tmatrix;
122 tmatrix = tmt;
123 dotransform = !tmt.isIdentity;
124 scope(exit) tmatrix = old;
125 dg();
126 return this;
129 nothrow @trusted @nogc:
130 protected:
131 enum distTol = cast(float)(1.0f/256.0f);
132 enum KAPPA90 = 0.5522847493f; // length proportional to radius of a cubic bezier handle for 90deg arcs
134 // this does some fancy logic
135 void addVtx (float fx, float fy, uint cmd) {
136 pragma(inline, true);
137 assert(isLineTo(cmd) || isMoveTo(cmd) || isEndPoly(cmd));
139 if (isEndPoly(cmd) && (fx != fx || fy != fy)) {
140 fx = lastX;
141 fy = lastY;
142 } else {
143 assert(fx == fx && fy == fy); // reject infs and nans
144 if (!isEndPoly(cmd)) {
145 utlastX = fx;
146 utlastY = fy;
148 // transform coords
149 if (dotransform) {
150 tmatrix.point(&fx, &fy, fx, fy);
151 assert(fx == fx && fy == fy); // reject infs and nans
155 // moveto?
156 if (isMoveTo(cmd)) {
157 // if we just end the poly, record new coords, but don't emit any command
158 if (vtx.isEmpty || isEndPoly(vtx[$-1u].cmd)) {
159 // postpone it
160 lastStartX = lastX = fx;
161 lastStartY = lastY = fy;
162 return;
164 // if prev was moveto, just fix it
165 if (isMoveTo(vtx[$-1u].cmd)) {
166 vtx[$-1u].x = lastX = fx;
167 vtx[$-1u].y = lastY = fy;
168 return;
170 // prev should be a line, emit move
171 assert(isLineTo(vtx[$-1u].cmd));
172 vtx.add(Vertex(fx, fy, cmd));
173 lastX = fx;
174 lastY = fy;
175 return;
178 // lineto?
179 if (isLineTo(cmd)) {
180 // if we just end the poly, move to the new start
181 // (we may have postponed "move to" here, and this will "flush" it)
182 if (vtx.isEmpty || isEndPoly(vtx[$-1u].cmd)) {
183 vtx.add(Vertex(lastX, lastY, PathCommand.MoveTo));
185 // if prev is "line to", reject duplicate points
186 // we cannot have empty vertex array here
187 if (isLineTo(vtx[$-1u].cmd) && ptEquals(fx, fy, vtx[$-1u].x, vtx[$-1u].y)) return;
188 vtx.add(Vertex(fx, fy, cmd));
189 lastX = fx;
190 lastY = fy;
191 return;
194 // end poly
195 assert(isEndPoly(cmd));
196 // do not emit if if we haven't any poly points yet
197 if (vtx.isEmpty || isEndPoly(vtx[$-1u].cmd)) return;
198 // we cannot have polys with "move only", no need to check for that
199 // need to close the poly?
200 if (isClose(cmd)) {
201 // we can have "move to" recorded, take it back
202 if (isMoveTo(vtx[$-1u].cmd)) {
203 immutable float mx = vtx[$-1u].x;
204 immutable float my = vtx[$-1u].y;
205 vtx.removeLast();
206 assert(!vtx.isEmpty && isLineTo(vtx[$-1u].cmd));
207 if (!ptEquals(lastStartX, lastStartY, vtx[$-1u].x, vtx[$-1u].y)) {
208 // close contour
209 vtx.add(Vertex(lastStartX, lastStartY, PathCommand.LineTo));
211 // no need to put close command back
212 vtx.add(Vertex(fx, fy, cmd));
213 assert(lastX == mx && lastY == my);
214 lastStartX = mx;
215 lastStartY = my;
216 } else {
217 // we should have "line to" recorded
218 assert(!vtx.isEmpty && isLineTo(vtx[$-1u].cmd));
219 if (!ptEquals(lastStartX, lastStartY, vtx[$-1u].x, vtx[$-1u].y)) {
220 // close contour
221 vtx.add(Vertex(lastStartX, lastStartY, PathCommand.LineTo));
223 vtx.add(Vertex(fx, fy, cmd));
224 // fix current coords
225 lastStartX = lastX = fx;
226 lastStartY = lastY = fy;
228 return;
231 // end poly w/o closing
232 // do nothing (do not take back last "move to")
233 assert(!vtx.isEmpty);
234 vtx.add(Vertex(fx, fy, cmd));
237 @property bool hasPolyPoints () const pure {
238 pragma(inline, true);
239 return (!vtx.isEmpty && isMoveTo(vtx[$-1u].cmd));
242 public:
243 void dumpVertices () {
244 import core.stdc.stdio : stderr, fprintf;
245 fprintf(stderr, "=== VERTEX COUNT: %u ===\n", vtx.length);
246 foreach (immutable uint idx; 0..vtx.length) {
247 fprintf(stderr, " %u: (%g, %g) : 0x%02x\n", idx, vtx[idx].x, vtx[idx].y, vtx[idx].cmd);
249 fprintf(stderr, "-------\n");
252 protected:
253 Stroker mStroker;
254 Contourer mContourer;
255 Dasher mDasher;
257 public:
258 @property void lineCap (in LineCap lc) { pragma(inline, true); mStroker.lineCap(lc); }
259 @property void lineJoin (in LineJoin lj) { pragma(inline, true); mStroker.lineJoin(lj); }
260 @property void innerJoin (in InnerJoin ij) { pragma(inline, true); mStroker.innerJoin(ij); }
262 @property LineCap lineCap () const pure { pragma(inline, true); return mStroker.lineCap(); }
263 @property LineJoin lineJoin () const pure { pragma(inline, true); return mStroker.lineJoin(); }
264 @property InnerJoin innerJoin () const pure { pragma(inline, true); return mStroker.innerJoin(); }
266 @property void width (in float w) { pragma(inline, true); mStroker.width(w); }
267 @property void miterLimit (in float ml) { pragma(inline, true); mStroker.miterLimit(ml); }
268 @property void miterLimitTheta (in float t) { pragma(inline, true); mStroker.miterLimitTheta(t); }
269 @property void innerMiterLimit (in float ml) { pragma(inline, true); mStroker.innerMiterLimit(ml); }
270 @property void approximationScale (in float as) { pragma(inline, true); mStroker.approximationScale(as); }
272 @property float width () const pure { pragma(inline, true); return mStroker.width(); }
273 @property float miterLimit () const pure { pragma(inline, true); return mStroker.miterLimit(); }
274 @property float innerMiterLimit () const pure { pragma(inline, true); return mStroker.innerMiterLimit(); }
275 @property float approximationScale () const pure { pragma(inline, true); return mStroker.approximationScale(); }
277 // for contourer
278 @property void autoDetectOrientation (bool v) { pragma(inline, true); mContourer.autoDetectOrientation(v); }
279 @property bool autoDetectOrientation () const pure { pragma(inline, true); return mContourer.autoDetectOrientation; }
281 @property void shorten (in float s) { pragma(inline, true); mStroker.shorten = s; }
282 @property float shorten () const pure { pragma(inline, true); return mStroker.shorten; }
284 void resetDashes () { pragma(inline, true); mDasher.removeAllDashes(); }
285 void addDash (in float dashLen, in float gapLen) { pragma(inline, true); mDasher.addDash(dashLen, gapLen); }
286 void dashStart (in float ds) { pragma(inline, true); mDasher.dashStart(ds); }
288 @property FillRule fillRule () const pure { pragma(inline, true); return rast.fillRule; }
289 @property void fillRule (FillRule v) { pragma(inline, true); rast.fillRule = v; }
291 // untransformed
292 @property float currX () const pure { pragma(inline, true); return utlastX; }
293 @property float currY () const pure { pragma(inline, true); return utlastY; }
295 // transformed
296 @property float realCurrX () const pure { pragma(inline, true); return lastX; }
297 @property float realCurrY () const pure { pragma(inline, true); return lastY; }
299 @property AGGMatrix getTransform () const pure { pragma(inline, true); return tmatrix; }
301 @property void transform() (in auto ref AGGMatrix tmt) {
302 tmatrix = tmt;
303 dotransform = !tmt.isIdentity;
306 void resetTransform () {
307 if (dotransform) {
308 tmatrix.identity();
309 dotransform = false;
314 // ////////////////////////////////////////////////////////////////////////// //
315 // Vetex Producer API
316 void rewind () {
317 pragma(inline, true);
318 vpIdx = 0;
321 uint vertex (float* x, float* y) {
322 if (vpIdx >= vtx.length) return PathCommand.Stop;
323 *x = vtx[vpIdx].x;
324 *y = vtx[vpIdx].y;
325 return vtx[vpIdx++].cmd;
329 // ////////////////////////////////////////////////////////////////////////// //
330 // Vetex Consumer API does rasterising
331 void removeAll () {
332 pragma(inline, true);
333 rcsm = rcsm.init;
334 version(egra_aggmini_debug_rasta) { import core.stdc.stdio : stderr, fprintf; fprintf(stderr, "=== DRAWER: RENDER RESET ===\n"); }
337 void addVertex (float x, float y, uint cmd) {
338 // stop?
339 if (isStop(cmd)) {
340 //removeAll();
341 version(egra_aggmini_debug_rasta) { import core.stdc.stdio : stderr, fprintf; fprintf(stderr, "=== DRAWER: RENDER STOP ===\n"); }
342 rcsm = rcsm.init;
343 return;
346 // line/move?
347 if (isLineTo(cmd) || isMoveTo(cmd)) {
348 version(egra_aggmini_debug_rasta) {
349 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " pre*: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
350 (isLineTo(cmd) ? "lineto".ptr : "moveto".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
352 if (!rcsm.lineCmdCount) { rcsm.startX = x; rcsm.startY = y; rcsm.lineCmdCount = 1; }
353 if (isLineTo(cmd)) {
354 // do not add duplicate points
355 if (rcsm.lineCmdCount < 2 || !ptEquals(x, y, rcsm.lastX, rcsm.lastY)) rast.lineTo(x, y);
356 ++rcsm.lineCmdCount;
357 } else {
358 rast.moveTo(x, y);
359 rcsm.lineCmdCount = 1;
361 rcsm.lastX = x;
362 rcsm.lastY = y;
363 version(egra_aggmini_debug_rasta) {
364 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " post: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
365 (isLineTo(cmd) ? "lineto".ptr : "moveto".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
367 return;
370 // end poly?
371 if (isEndPoly(cmd)) {
372 version(egra_aggmini_debug_rasta) {
373 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " pre*: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
374 (isClose(cmd) ? "close".ptr : "end".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
376 // close poly?
377 if (rcsm.lineCmdCount > 2 && isClose(cmd) && !ptEquals(rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY)) {
378 rast.lineTo(rcsm.startX, rcsm.startY);
379 rcsm.lastX = rcsm.startX;
380 rcsm.lastY = rcsm.startY;
382 rcsm.lineCmdCount = 0;
383 // don't do "move to" here, it breaks rendering
384 version(egra_aggmini_debug_rasta) {
385 import core.stdc.stdio : stderr, fprintf; fprintf(stderr, " post: %s: (%g, %g) lineCmdCount=%u; start=(%g,%g); last=(%g,%g)\n",
386 (isClose(cmd) ? "close".ptr : "end".ptr), x, y, rcsm.lineCmdCount, rcsm.startX, rcsm.startY, rcsm.lastX, rcsm.lastY);
388 return;
391 assert(0, "invalid path command");
395 // ////////////////////////////////////////////////////////////////////////// //
396 ref AGGDrawer resetParams () {
397 width = 1.5f;
398 miterLimit = 4.0f;
399 innerMiterLimit = 1.01f;
400 approximationScale = 1.0f;
401 lineCap = LineCap.Butt;
402 lineJoin = LineJoin.Miter;
403 innerJoin = InnerJoin.Miter;
404 return this;
407 ref AGGDrawer beginFrame () {
408 resetTransform();
409 vtx.removeAll();
410 vpIdx = 0;
411 lastStartX = lastX = utlastX = 0.0f;
412 lastStartY = lastY = utlastY = 0.0f;
413 rast.reset();
414 return resetParams();
417 ref AGGDrawer cancelFrame () {
418 return beginFrame();
421 // this doesn't reset params or transform
422 ref AGGDrawer resetFrame () {
423 vtx.removeAll();
424 vpIdx = 0;
425 lastStartX = lastX = utlastX = 0.0f;
426 lastStartY = lastY = utlastY = 0.0f;
427 rast.reset();
428 return this;
431 // input coords are unaffected by transform
432 // returns alpha (0 means "no hit")
433 ubyte hitTest (in int x, in int y) { pragma(inline, true); return rast.hitTest(x, y); }
435 // doesn't reset pathes
436 ref AGGDrawer render (in GxColor c, in bool doReset=true) {
437 if (!gxIsTransparent(c)) {
438 GxRect clipRect = gxClipRect;
439 if (clipRect.intersect(0, 0, VBufWidth, VBufHeight)) {
440 rast.render(clipRect, c);
442 if (doReset) rast.reset();
444 return this;
447 ref AGGDrawer renderNoReset (in GxColor c) { pragma(inline, true); return render(c, doReset:false); }
449 ref AGGDrawer endFrame (in GxColor c=gxTransparent) {
450 render(c);
451 return beginFrame();
454 ref AGGDrawer beginPath () {
455 pragma(inline, true);
456 vtx.removeAll();
457 return this;
460 ref AGGDrawer endPoly () {
461 addVtx(lastX, lastY, PathCommand.EndPoly);
462 return this;
465 ref AGGDrawer closePoly () {
466 addVtx(lastX, lastY, PathCommand.EndPoly|PathFlag.Close);
467 return this;
470 // starts new sub-path with specified point as first point
471 ref AGGDrawer moveTo (in float x, in float y) { pragma(inline, true); addVtx(x, y, PathCommand.MoveTo); return this; }
473 // adds line segment from the last point in the path to the specified point
474 ref AGGDrawer lineTo (in float x, in float y) { pragma(inline, true); addVtx(x, y, PathCommand.LineTo); return this; }
476 // adds cubic bezier segment from last point in the path via two control points to the specified point
477 ref AGGDrawer bezierTo (in float x2, in float y2, in float x3, in float y3, in float x4, in float y4) {
478 pragma(inline, true);
479 //tesselateBezierMcSeem(currX, currY, x2, y2, x3, y3, x4, y4, 0);
480 tesselateBezier(currX, currY, x2, y2, x3, y3, x4, y4);
481 return this;
484 // adds quadratic bezier segment from last point in the path via a control point to the specified point
485 void quadTo (in float cx, in float cy, in float x, in float y) {
486 immutable float x0 = currX;
487 immutable float y0 = currY;
488 bezierTo(
489 x0+2.0f/3.0f*(cx-x0), y0+2.0f/3.0f*(cy-y0),
490 x+2.0f/3.0f*(cx-x), y+2.0f/3.0f*(cy-y),
491 x, y,
495 // adds an arc segment at the corner defined by the last path point, and two specified points
496 ref AGGDrawer arcTo (in float x1, in float y1, in float x2, in float y2, in float radius) {
497 import core.stdc.math : acosf, tanf, atan2f;
499 immutable float x0 = currX;
500 immutable float y0 = currY;
502 // handle degenerate cases
503 if (ptEquals(x0, y0, x1, y1) ||
504 ptEquals(x1, y1, x2, y2) ||
505 distPtSegSq(x1, y1, x0, y0, x2, y2) < distTol*distTol ||
506 radius < distTol)
508 lineTo(x1, y1);
509 return this;
512 // calculate tangential circle to lines (x0, y0)-(x1, y1) and (x1, y1)-(x2, y2)
513 float dx0 = x0-x1;
514 float dy0 = y0-y1;
515 float dx1 = x2-x1;
516 float dy1 = y2-y1;
517 normalize(ref dx0, ref dy0);
518 normalize(ref dx1, ref dy1);
519 immutable float a = acosf(dx0*dx1+dy0*dy1);
520 immutable float d = radius/tanf(a*0.5f);
522 if (d > 10000.0f) {
523 lineTo(x1, y1);
524 return this;
527 float cx = void, cy = void, a0 = void, a1 = void;
528 Winding dir = void;
529 if (cross2(dx0, dy0, dx1, dy1) > 0.0f) {
530 cx = x1+dx0*d+dy0*radius;
531 cy = y1+dy0*d+-dx0*radius;
532 a0 = atan2f(dx0, -dy0);
533 a1 = atan2f(-dx1, dy1);
534 dir = Winding.CW;
535 //printf("CW c=(%f, %f) a0=%f° a1=%f°\n", cx, cy, a0/NVG_PI*180.0f, a1/NVG_PI*180.0f);
536 } else {
537 cx = x1+dx0*d+-dy0*radius;
538 cy = y1+dy0*d+dx0*radius;
539 a0 = atan2f(-dx0, dy0);
540 a1 = atan2f(dx1, -dy1);
541 dir = Winding.CCW;
542 //printf("CCW c=(%f, %f) a0=%f° a1=%f°\n", cx, cy, a0/NVG_PI*180.0f, a1/NVG_PI*180.0f);
545 return arc(dir, cx, cy, radius, a0, a1); // first is line
549 // ////////////////////////////////////////////////////////////////////////// //
550 protected void streamFromStroker () {
551 // no need to close polys, our consumer will do it
552 streamAllVertices!false(mStroker, this);
553 mStroker.removeAll();
556 protected void streamToStrokerAndRender(VS) (ref VS vs) if (IsGoodVertexProducer!VS) {
557 streamAllVertices(vs, mStroker, &streamFromStroker);
561 // ////////////////////////////////////////////////////////////////////////// //
562 // fill pathes
563 ref AGGDrawer fill () {
564 streamAllVertices!false(this, this); // no need to close polys, our consumer will do it
565 removeAll();
566 return this;
569 // stroke pathes
570 ref AGGDrawer stroke () {
571 if (vtx.isEmpty) return this;
572 streamAllVertices(this, mStroker, &streamFromStroker);
573 return this;
576 // set parameters, and then call this
577 ref AGGDrawer setupContour (in float ctrwidth) {
578 mContourer.lineCap = mStroker.lineCap;
579 mContourer.lineJoin = mStroker.lineJoin;
580 mContourer.innerJoin = mStroker.innerJoin;
582 mContourer.width = /*mStroker.width*/ctrwidth;
583 mContourer.miterLimit = mStroker.miterLimit;
584 mContourer.innerMiterLimit = mStroker.innerMiterLimit;
585 mContourer.approximationScale = mStroker.approximationScale;
586 return this;
589 // contour pathes
590 ref AGGDrawer contour () {
591 if (vtx.isEmpty) return this;
592 streamAllVertices(this, mContourer, &streamToStrokerAndRender!(typeof(mContourer)));
593 return this;
596 // dash pathes
597 ref AGGDrawer dashStroke () {
598 if (vtx.isEmpty) return this;
599 if (!mDasher.hasDashes) return stroke();
600 mDasher.shorten = mStroker.shorten;
601 streamAllVertices(this, mDasher, &streamToStrokerAndRender!(typeof(mDasher)));
602 return this;
606 // ////////////////////////////////////////////////////////////////////////// //
607 /* Creates new circle arc shaped sub-path. The arc center is at (cx, cy), the arc radius is r,
608 * and the arc is drawn from angle a0 to a1, and swept in direction dir (NVGWinding.CCW, or NVGWinding.CW).
609 * Angles are specified in radians.
611 * [mode] is: "original", "move", "line" -- first command will be like original NanoVega, MoveTo, or LineTo
613 ref AGGDrawer arc(string mode="original") (Winding dir, in float cx, in float cy, in float r,
614 in float a0, in float a1)
616 static assert(mode == "original" || mode == "move" || mode == "line");
617 import core.stdc.math : fabsf, cosf, sinf;
619 //int move = (ctx.ncommands > 0 ? Command.LineTo : Command.MoveTo);
620 static if (mode == "original") {
621 bool asMove = !hasPolyPoints;
622 } else static if (mode == "move") {
623 enum asMove = true;
624 } else static if (mode == "line") {
625 enum asMove = false;
626 } else {
627 static assert(0, "wtf?!");
630 // clamp angles
631 float da = a1-a0;
632 if (dir == Winding.CW) {
633 if (fabsf(da) >= FLT_PI*2.0f) {
634 da = FLT_PI*2.0f;
635 } else {
636 while (da < 0.0f) da += FLT_PI*2.0f;
638 } else {
639 if (fabsf(da) >= FLT_PI*2.0f) {
640 da = -FLT_PI*2.0f;
641 } else {
642 while (da > 0.0f) da -= FLT_PI*2.0f;
646 // split arc into max 90 degree segments
647 immutable int ndivs = max(1, min(cast(int)(fabsf(da)/(FLT_PI*0.5f)+0.5f), 5));
648 immutable float hda = (da/cast(float)ndivs)*0.5f;
649 float kappa = fabsf(4.0f/3.0f*(1.0f-cosf(hda))/sinf(hda));
650 if (dir == Winding.CCW) kappa = -kappa;
652 int nvals = 0;
653 float px = 0, py = 0, ptanx = 0, ptany = 0;
654 foreach (int i; 0..ndivs+1) {
655 immutable float a = a0+da*(i/cast(float)ndivs);
656 immutable float dx = cosf(a);
657 immutable float dy = sinf(a);
658 immutable float x = cx+dx*r;
659 immutable float y = cy+dy*r;
660 immutable float tanx = -dy*r*kappa;
661 immutable float tany = dx*r*kappa;
663 if (i == 0) {
664 if (asMove) moveTo(x, y); else lineTo(x, y);
665 } else {
666 bezierTo(px+ptanx, py+ptany, x-tanx, y-tany, x, y);
668 px = x;
669 py = y;
670 ptanx = tanx;
671 ptany = tany;
674 return this;
677 // creates new rectangle shaped sub-path
678 ref AGGDrawer rect (in float x, in float y, in float w, in float h) {
679 if (w && h) {
680 moveTo(x, y);
681 lineTo(x, y+h);
682 lineTo(x+w, y+h);
683 lineTo(x+w, y);
684 lineTo(x, y); // close it
686 return this;
689 // creates new rounded rectangle shaped sub-path
690 ref AGGDrawer roundedRect (in float x, in float y, in float w, in float h, in float radius) {
691 return roundedRectVarying(x, y, w, h, radius, radius, radius, radius);
694 // creates new rounded rectangle shaped sub-path
695 // specify ellipse width and height to round corners according to it
696 ref AGGDrawer roundedRectEllipse (in float x, in float y, in float w, in float h, in float rw, in float rh) {
697 if (rw < 0.1f || rh < 0.1f) return rect(x, y, w, h);
698 moveTo(x+rw, y);
699 lineTo(x+w-rw, y);
700 bezierTo(x+w-rw*(1.0f-KAPPA90), y, x+w, y+rh*(1.0f-KAPPA90), x+w, y+rh);
701 lineTo(x+w, y+h-rh);
702 bezierTo(x+w, y+h-rh*(1.0f-KAPPA90), x+w-rw*(1.0f-KAPPA90), y+h, x+w-rw, y+h);
703 lineTo(x+rw, y+h);
704 bezierTo(x+rw*(1.0f-KAPPA90), y+h, x, y+h-rh*(1.0f-KAPPA90), x, y+h-rh);
705 lineTo(x, y+rh);
706 bezierTo(x, y+rh*(1.0f-KAPPA90), x+rw*(1.0f-KAPPA90), y, x+rw, y);
707 return closePoly();
710 // creates new rounded rectangle shaped sub-path
711 // this one allows you to specify different rounding radii for each corner
712 ref AGGDrawer roundedRectVarying (in float x, in float y, in float w, in float h,
713 in float radTopLeft, in float radTopRight,
714 in float radBottomRight, in float radBottomLeft)
716 import core.stdc.math : fabsf;
717 if (radTopLeft < 0.1f && radTopRight < 0.1f && radBottomRight < 0.1f && radBottomLeft < 0.1f) return rect(x, y, w, h);
718 immutable float halfw = fabsf(w)*0.5f;
719 immutable float halfh = fabsf(h)*0.5f;
720 immutable float rxBL = min(radBottomLeft, halfw)*sign(w), ryBL = min(radBottomLeft, halfh)*sign(h);
721 immutable float rxBR = min(radBottomRight, halfw)*sign(w), ryBR = min(radBottomRight, halfh)*sign(h);
722 immutable float rxTR = min(radTopRight, halfw)*sign(w), ryTR = min(radTopRight, halfh)*sign(h);
723 immutable float rxTL = min(radTopLeft, halfw)*sign(w), ryTL = min(radTopLeft, halfh)*sign(h);
724 moveTo(x, y+ryTL);
725 lineTo(x, y+h-ryBL);
726 bezierTo(x, y+h-ryBL*(1.0f-KAPPA90), x+rxBL*(1.0f-KAPPA90), y+h, x+rxBL, y+h);
727 lineTo(x+w-rxBR, y+h);
728 bezierTo(x+w-rxBR*(1.0f-KAPPA90), y+h, x+w, y+h-ryBR*(1.0f-KAPPA90), x+w, y+h-ryBR);
729 lineTo(x+w, y+ryTR);
730 bezierTo(x+w, y+ryTR*(1.0f-KAPPA90), x+w-rxTR*(1.0f-KAPPA90), y, x+w-rxTR, y);
731 lineTo(x+rxTL, y);
732 bezierTo(x+rxTL*(1.0f-KAPPA90), y, x, y+ryTL*(1.0f-KAPPA90), x, y+ryTL);
733 return closePoly();
736 // creates new ellipse shaped sub-path
737 ref AGGDrawer ellipse (in float cx, in float cy, in float rx, in float ry) {
738 moveTo(cx-rx, cy);
739 bezierTo(cx-rx, cy+ry*KAPPA90, cx-rx*KAPPA90, cy+ry, cx, cy+ry);
740 bezierTo(cx+rx*KAPPA90, cy+ry, cx+rx, cy+ry*KAPPA90, cx+rx, cy);
741 bezierTo(cx+rx, cy-ry*KAPPA90, cx+rx*KAPPA90, cy-ry, cx, cy-ry);
742 bezierTo(cx-rx*KAPPA90, cy-ry, cx-rx, cy-ry*KAPPA90, cx-rx, cy);
743 return closePoly();
746 // creates new circle shaped sub-path
747 ref AGGDrawer circle (in float cx, in float cy, in float r) {
748 return ellipse(cx, cy, r, r);
751 private:
752 // ////////////////////////////////////////////////////////////////////////// //
753 void tesselateBezierDCj (in float x1, in float y1, in float x2, in float y2,
754 in float x3, in float y3, in float x4, in float y4, in int level)
756 import core.stdc.math : fabsf;
757 if (level > bezierLimit) return;
759 immutable float x12 = (x1+x2)*0.5f;
760 immutable float y12 = (y1+y2)*0.5f;
761 immutable float x23 = (x2+x3)*0.5f;
762 immutable float y23 = (y2+y3)*0.5f;
763 immutable float x34 = (x3+x4)*0.5f;
764 immutable float y34 = (y3+y4)*0.5f;
765 immutable float x123 = (x12+x23)*0.5f;
766 immutable float y123 = (y12+y23)*0.5f;
768 immutable float dx = x4-x1;
769 immutable float dy = y4-y1;
770 immutable float d2 = fabsf(((x2-x4)*dy-(y2-y4)*dx));
771 immutable float d3 = fabsf(((x3-x4)*dy-(y3-y4)*dx));
773 if ((d2+d3)*(d2+d3) < tessTol*(dx*dx+dy*dy)) {
774 lineTo(x4, y4);
775 return;
778 immutable float x234 = (x23+x34)*0.5f;
779 immutable float y234 = (y23+y34)*0.5f;
780 immutable float x1234 = (x123+x234)*0.5f;
781 immutable float y1234 = (y123+y234)*0.5f;
783 // "taxicab" / "manhattan" check for flat curves
784 if (fabsf(x1+x3-x2-x2)+fabsf(y1+y3-y2-y2)+fabsf(x2+x4-x3-x3)+fabsf(y2+y4-y3-y3) < tessTol*0.25f) {
785 lineTo(x1234, y1234);
786 return;
789 tesselateBezierDCj(x1, y1, x12, y12, x123, y123, x1234, y1234, level+1);
790 tesselateBezierDCj(x1234, y1234, x234, y234, x34, y34, x4, y4, level+1);
793 // ////////////////////////////////////////////////////////////////////////// //
794 // based on the ideas and code of Maxim Shemanarev. Rest in Peace, bro!
795 // see http://www.antigrain.com/research/adaptive_bezier/index.html
796 void tesselateBezierMcSeem (in float x1, in float y1, in float x2, in float y2,
797 in float x3, in float y3, in float x4, in float y4, in int level)
799 import core.stdc.math : fabsf, atan2f;
801 enum CollinearEPS = 0.00000001f; // 0.00001f;
802 enum AngleTolEPS = 0.01f;
804 static float distSquared (in float x1, in float y1, in float x2, in float y2) pure nothrow @safe @nogc {
805 pragma(inline, true);
806 immutable float dx = x2-x1;
807 immutable float dy = y2-y1;
808 return dx*dx+dy*dy;
812 if (level == 0) {
813 lineTo(x1, y1/*, 0*/);
814 tesselateBezierMcSeem(x1, y1, x2, y2, x3, y3, x4, y4, 1/*, type*/);
815 lineTo(x4, y4/*, type*/);
816 return;
820 if (level > bezierLimit) return; // recurse limit; practically, it should be never reached, but...
822 // calculate all the mid-points of the line segments
823 immutable float x12 = (x1+x2)*0.5f;
824 immutable float y12 = (y1+y2)*0.5f;
825 immutable float x23 = (x2+x3)*0.5f;
826 immutable float y23 = (y2+y3)*0.5f;
827 immutable float x34 = (x3+x4)*0.5f;
828 immutable float y34 = (y3+y4)*0.5f;
829 immutable float x123 = (x12+x23)*0.5f;
830 immutable float y123 = (y12+y23)*0.5f;
831 immutable float x234 = (x23+x34)*0.5f;
832 immutable float y234 = (y23+y34)*0.5f;
833 immutable float x1234 = (x123+x234)*0.5f;
834 immutable float y1234 = (y123+y234)*0.5f;
836 // try to approximate the full cubic curve by a single straight line
837 immutable float dx = x4-x1;
838 immutable float dy = y4-y1;
840 float d2 = fabsf(((x2-x4)*dy-(y2-y4)*dx));
841 float d3 = fabsf(((x3-x4)*dy-(y3-y4)*dx));
843 final switch ((cast(int)(d2 > CollinearEPS)<<1)+cast(int)(d3 > CollinearEPS)) {
844 case 0:
845 // all collinear or p1 == p4
846 float k = dx*dx+dy*dy;
847 if (k == 0.0f) {
848 d2 = distSquared(x1, y1, x2, y2);
849 d3 = distSquared(x4, y4, x3, y3);
850 } else {
851 k = 1.0f/k;
852 float da1 = x2-x1;
853 float da2 = y2-y1;
854 d2 = k*(da1*dx+da2*dy);
855 da1 = x3-x1;
856 da2 = y3-y1;
857 d3 = k*(da1*dx+da2*dy);
858 if (d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1) {
859 // Simple collinear case, 1---2---3---4
860 // We can leave just two endpoints
861 return;
863 if (d2 <= 0.0f) d2 = distSquared(x2, y2, x1, y1);
864 else if (d2 >= 1.0f) d2 = distSquared(x2, y2, x4, y4);
865 else d2 = distSquared(x2, y2, x1+d2*dx, y1+d2*dy);
867 if (d3 <= 0.0f) d3 = distSquared(x3, y3, x1, y1);
868 else if (d3 >= 1.0f) d3 = distSquared(x3, y3, x4, y4);
869 else d3 = distSquared(x3, y3, x1+d3*dx, y1+d3*dy);
871 if (d2 > d3) {
872 if (d2 < tessTol) {
873 lineTo(x2, y2);
874 return;
876 } if (d3 < tessTol) {
877 lineTo(x3, y3);
878 return;
880 break;
881 case 1:
882 // p1,p2,p4 are collinear, p3 is significant
883 if (d3*d3 <= tessTol*(dx*dx+dy*dy)) {
884 if (angleTol < AngleTolEPS) {
885 lineTo(x23, y23);
886 return;
887 } else {
888 // angle condition
889 float da1 = fabsf(atan2f(y4-y3, x4-x3)-atan2f(y3-y2, x3-x2));
890 if (da1 >= FLT_PI) da1 = 2.0f*FLT_PI-da1;
891 if (da1 < angleTol) {
892 lineTo(x2, y2);
893 lineTo(x3, y3);
894 return;
896 if (cuspLimit != 0.0f) {
897 if (da1 > cuspLimit) {
898 lineTo(x3, y3);
899 return;
904 break;
905 case 2:
906 // p1,p3,p4 are collinear, p2 is significant
907 if (d2*d2 <= tessTol*(dx*dx+dy*dy)) {
908 if (angleTol < AngleTolEPS) {
909 lineTo(x23, y23);
910 return;
911 } else {
912 // angle condition
913 float da1 = fabsf(atan2f(y3-y2, x3-x2)-atan2f(y2-y1, x2-x1));
914 if (da1 >= FLT_PI) da1 = 2.0f*FLT_PI-da1;
915 if (da1 < angleTol) {
916 lineTo(x2, y2);
917 lineTo(x3, y3);
918 return;
920 if (cuspLimit != 0.0f) {
921 if (da1 > cuspLimit) {
922 lineTo(x2, y2);
923 return;
928 break;
929 case 3:
930 // regular case
931 if ((d2+d3)*(d2+d3) <= tessTol*(dx*dx+dy*dy)) {
932 // if the curvature doesn't exceed the distance tolerance value, we tend to finish subdivisions
933 if (angleTol < AngleTolEPS) {
934 lineTo(x23, y23);
935 return;
936 } else {
937 // angle and cusp condition
938 immutable float k = atan2f(y3-y2, x3-x2);
939 float da1 = fabsf(k-atan2f(y2-y1, x2-x1));
940 float da2 = fabsf(atan2f(y4-y3, x4-x3)-k);
941 if (da1 >= FLT_PI) da1 = 2.0f*FLT_PI-da1;
942 if (da2 >= FLT_PI) da2 = 2.0f*FLT_PI-da2;
943 if (da1+da2 < angleTol) {
944 // finally we can stop the recursion
945 lineTo(x23, y23);
946 return;
948 if (cuspLimit != 0.0f) {
949 if (da1 > cuspLimit) {
950 lineTo(x2, y2);
951 return;
953 if (da2 > cuspLimit) {
954 lineTo(x3, y3);
955 return;
960 break;
963 // continue subdivision
964 tesselateBezierMcSeem(x1, y1, x12, y12, x123, y123, x1234, y1234, level+1);
965 tesselateBezierMcSeem(x1234, y1234, x234, y234, x34, y34, x4, y4, level+1);
968 // Adaptive forward differencing for bezier tesselation.
969 // See Lien, Sheue-Ling, Michael Shantz, and Vaughan Pratt.
970 // "Adaptive forward differencing for rendering curves and surfaces."
971 // ACM SIGGRAPH Computer Graphics. Vol. 21. No. 4. ACM, 1987.
972 // original code by Taylor Holliday <taylor@audulus.com>
973 void tesselateBezierAFD (in float x1, in float y1, in float x2, in float y2,
974 in float x3, in float y3, in float x4, in float y4)
976 enum AFD_ONE = (1<<10);
978 // power basis
979 immutable float ax = -x1+3*x2-3*x3+x4;
980 immutable float ay = -y1+3*y2-3*y3+y4;
981 immutable float bx = 3*x1-6*x2+3*x3;
982 immutable float by = 3*y1-6*y2+3*y3;
983 immutable float cx = -3*x1+3*x2;
984 immutable float cy = -3*y1+3*y2;
986 // Transform to forward difference basis (stepsize 1)
987 float px = x1;
988 float py = y1;
989 float dx = ax+bx+cx;
990 float dy = ay+by+cy;
991 float ddx = 6*ax+2*bx;
992 float ddy = 6*ay+2*by;
993 float dddx = 6*ax;
994 float dddy = 6*ay;
996 //printf("dx: %f, dy: %f\n", dx, dy);
997 //printf("ddx: %f, ddy: %f\n", ddx, ddy);
998 //printf("dddx: %f, dddy: %f\n", dddx, dddy);
1000 int t = 0;
1001 int dt = AFD_ONE;
1003 immutable float tol = tessTol*4.0f;
1005 while (t < AFD_ONE) {
1006 // Flatness measure.
1007 float d = ddx*ddx+ddy*ddy+dddx*dddx+dddy*dddy;
1009 // printf("d: %f, th: %f\n", d, th);
1011 // Go to higher resolution if we're moving a lot or overshooting the end.
1012 while ((d > tol && dt > 1) || (t+dt > AFD_ONE)) {
1013 // printf("up\n");
1015 // Apply L to the curve. Increase curve resolution.
1016 dx = 0.5f*dx-(1.0f/8.0f)*ddx+(1.0f/16.0f)*dddx;
1017 dy = 0.5f*dy-(1.0f/8.0f)*ddy+(1.0f/16.0f)*dddy;
1018 ddx = (1.0f/4.0f)*ddx-(1.0f/8.0f)*dddx;
1019 ddy = (1.0f/4.0f)*ddy-(1.0f/8.0f)*dddy;
1020 dddx = (1.0f/8.0f)*dddx;
1021 dddy = (1.0f/8.0f)*dddy;
1023 // Half the stepsize.
1024 dt >>= 1;
1026 // Recompute d
1027 d = ddx*ddx+ddy*ddy+dddx*dddx+dddy*dddy;
1030 // Go to lower resolution if we're really flat
1031 // and we aren't going to overshoot the end.
1032 // XXX: tol/32 is just a guess for when we are too flat.
1033 while ((d > 0 && d < tol/32.0f && dt < AFD_ONE) && (t+2*dt <= AFD_ONE)) {
1034 // printf("down\n");
1036 // Apply L^(-1) to the curve. Decrease curve resolution.
1037 dx = 2*dx+ddx;
1038 dy = 2*dy+ddy;
1039 ddx = 4*ddx+4*dddx;
1040 ddy = 4*ddy+4*dddy;
1041 dddx = 8*dddx;
1042 dddy = 8*dddy;
1044 // Double the stepsize.
1045 dt <<= 1;
1047 // Recompute d
1048 d = ddx*ddx+ddy*ddy+dddx*dddx+dddy*dddy;
1051 // Forward differencing.
1052 px += dx;
1053 py += dy;
1054 dx += ddx;
1055 dy += ddy;
1056 ddx += dddx;
1057 ddy += dddy;
1059 // Output a point.
1060 lineTo(px, py/*, (t > 0 ? type : 0)*/);
1062 // Advance along the curve.
1063 t += dt;
1065 // Ensure we don't overshoot.
1066 assert(t <= AFD_ONE);
1071 public void tesselateBezier (in float x1, in float y1, in float x2, in float y2,
1072 in float x3, in float y3, in float x4, in float y4)
1074 final switch (tesselator) with (AGGTesselation) {
1075 case DeCasteljau:
1076 tesselateBezierDCj(x1, y1, x2, y2, x3, y3, x4, y4, 0);
1077 break;
1078 case AFD:
1079 tesselateBezierAFD(x1, y1, x2, y2, x3, y3, x4, y4);
1080 break;
1081 case DeCasteljauMcSeem:
1082 lineTo(x1, y1);
1083 tesselateBezierMcSeem(x1, y1, x2, y2, x3, y3, x4, y4, 1);
1084 lineTo(x4, y4);
1085 break;
1089 // ////////////////////////////////////////////////////////////////////////// //
1090 public enum BaphometDims = 512; // [0..511]
1091 private enum baph_debug_time = false;
1092 private enum baph_debug_dump = false;
1093 public void renderBaphomet (float ofsx=0.0f, float ofsy=0.0f, float scalex=1.0f, float scaley=1.0f) {
1094 auto path = cast(const(ubyte)[])baphometPath;
1095 immutable plen = path.length;
1096 uint ppos = 0;
1098 enum Command {
1099 Bounds, // always first, has 4 args (x0, y0, x1, y1)
1100 StrokeMode,
1101 FillMode,
1102 StrokeFillMode,
1103 NormalStroke,
1104 ThinStroke,
1105 MoveTo,
1106 LineTo,
1107 CubicTo, // cubic bezier
1108 EndPath,
1111 Command getCommand () nothrow @trusted @nogc {
1112 if (ppos >= plen) assert(0, "invalid path");
1113 return cast(Command)(path.ptr[ppos++]);
1116 float getFloat () nothrow @trusted @nogc {
1117 if (ppos >= plen || plen-ppos < float.sizeof) assert(0, "invalid path");
1118 version(LittleEndian) {
1119 float res = *cast(const(float)*)(&path.ptr[ppos]);
1120 ppos += cast(uint)float.sizeof;
1121 return res;
1122 } else {
1123 static assert(float.sizeof == 4);
1124 uint xp = path.ptr[ppos]|(path.ptr[ppos+1]<<8)|(path.ptr[ppos+2]<<16)|(path.ptr[ppos+3]<<24);
1125 ppos += cast(uint)float.sizeof;
1126 return *cast(const(float)*)(&xp);
1130 float scaleX (in float v) nothrow @trusted @nogc { pragma(inline, true); return ofsx+cast(float)v*scalex; }
1131 float scaleY (in float v) nothrow @trusted @nogc { pragma(inline, true); return ofsy+cast(float)v*scaley; }
1133 static if (baph_debug_time) {
1134 import iv.pxclock;
1135 immutable tstt = clockMicro();
1138 beginPath();
1139 float cx = 0.0f, cy = 0.0f;
1140 bool doStroke = false, doFill = false;
1141 while (ppos < plen) {
1142 auto cmd = getCommand();
1143 static if (baph_debug_dump) {
1144 foreach (string mn; __traits(allMembers, Command)) {
1145 if (__traits(getMember, Command, mn) == cmd) {
1146 import core.stdc.stdio;
1147 static if (baph_debug_time) {
1148 printf("cmd=%s ... ", mn.ptr);
1149 } else {
1150 printf("cmd=%s\n", mn.ptr);
1154 static if (baph_debug_time) {
1155 immutable cstt = clockMicro();
1158 final switch (cmd) {
1159 case Command.Bounds: ppos += 4*cast(uint)float.sizeof; break;
1160 case Command.StrokeMode: doStroke = true; doFill = false; break;
1161 case Command.FillMode: doStroke = false; doFill = true; break;
1162 case Command.StrokeFillMode: doStroke = true; doFill = true; break;
1163 case Command.NormalStroke: case Command.ThinStroke: break;
1164 case Command.MoveTo:
1165 cx = scaleX(getFloat());
1166 cy = scaleY(getFloat());
1167 moveTo(cx, cy);
1168 break;
1169 case Command.LineTo:
1170 immutable float ex = scaleX(getFloat());
1171 immutable float ey = scaleY(getFloat());
1172 lineTo(ex, ey);
1173 cx = ex;
1174 cy = ey;
1175 break;
1176 case Command.CubicTo: // cubic bezier
1177 immutable float x1 = scaleX(getFloat());
1178 immutable float y1 = scaleY(getFloat());
1179 immutable float x2 = scaleX(getFloat());
1180 immutable float y2 = scaleY(getFloat());
1181 immutable float ex = scaleX(getFloat());
1182 immutable float ey = scaleY(getFloat());
1183 bezierTo(x1, y1, x2, y2, ex, ey);
1184 cx = ex;
1185 cy = ey;
1186 break;
1187 case Command.EndPath: // don't close this path
1188 if (doFill) fill();
1189 if (doStroke) stroke();
1190 //doFill = doStroke = false;
1191 beginPath();
1192 break;
1194 static if (baph_debug_dump && baph_debug_time) {
1195 immutable estt = clockMicro()-cstt;
1196 import core.stdc.stdio; printf("microsecs: %u\n", cast(uint)estt);
1199 if (doFill) {
1200 static if (baph_debug_time) {
1201 immutable fstt = clockMicro();
1203 fill();
1204 static if (baph_debug_time) {
1205 immutable t = clockMicro()-fstt;
1206 import core.stdc.stdio; printf("fill microsecs: %u\n", cast(uint)t);
1209 if (doStroke) {
1210 static if (baph_debug_time) {
1211 immutable sstt = clockMicro();
1213 stroke();
1214 static if (baph_debug_time) {
1215 immutable t = clockMicro()-sstt;
1216 import core.stdc.stdio; printf("stroke microsecs: %u\n", cast(uint)t);
1219 static if (baph_debug_time) {
1220 immutable estt = clockMicro()-tstt;
1221 import core.stdc.stdio; printf("total microsecs: %u\n", cast(uint)estt);
1223 beginPath();
1226 private static immutable ubyte[7641] baphometPath = [
1227 0x01,0x04,0x06,0x30,0x89,0x7f,0x43,0x00,0x80,0xff,0x43,0x08,0xa0,0x1d,0xc6,0x43,0x00,0x80,0xff,0x43,
1228 0x00,0x80,0xff,0x43,0xa2,0x1d,0xc6,0x43,0x00,0x80,0xff,0x43,0x30,0x89,0x7f,0x43,0x08,0x00,0x80,0xff,
1229 0x43,0x7a,0x89,0xe5,0x42,0xa0,0x1d,0xc6,0x43,0x00,0x00,0x00,0x00,0x30,0x89,0x7f,0x43,0x00,0x00,0x00,
1230 0x00,0x08,0x7a,0x89,0xe5,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x89,0xe5,0x42,0x00,0x00,
1231 0x00,0x00,0x30,0x89,0x7f,0x43,0x08,0x00,0x00,0x00,0x00,0xa2,0x1d,0xc6,0x43,0x7a,0x89,0xe5,0x42,0x00,
1232 0x80,0xff,0x43,0x30,0x89,0x7f,0x43,0x00,0x80,0xff,0x43,0x09,0x06,0x30,0x89,0x7f,0x43,0x72,0x87,0xdd,
1233 0x43,0x08,0x16,0x68,0xb3,0x43,0x72,0x87,0xdd,0x43,0x71,0x87,0xdd,0x43,0x17,0x68,0xb3,0x43,0x71,0x87,
1234 0xdd,0x43,0x30,0x89,0x7f,0x43,0x08,0x71,0x87,0xdd,0x43,0xd2,0x2f,0x18,0x43,0x16,0x68,0xb3,0x43,0x35,
1235 0xe2,0x87,0x42,0x30,0x89,0x7f,0x43,0x35,0xe2,0x87,0x42,0x08,0xd1,0x2f,0x18,0x43,0x35,0xe2,0x87,0x42,
1236 0x35,0xe2,0x87,0x42,0xd2,0x2f,0x18,0x43,0x35,0xe2,0x87,0x42,0x30,0x89,0x7f,0x43,0x08,0x35,0xe2,0x87,
1237 0x42,0x17,0x68,0xb3,0x43,0xd1,0x2f,0x18,0x43,0x72,0x87,0xdd,0x43,0x30,0x89,0x7f,0x43,0x72,0x87,0xdd,
1238 0x43,0x09,0x06,0x79,0xcb,0x11,0x43,0x62,0xbf,0xd7,0x42,0x07,0xa4,0x3f,0x7f,0x43,0x0b,0x86,0xdc,0x43,
1239 0x07,0x6c,0xb9,0xb2,0x43,0xe8,0xd1,0xca,0x42,0x07,0x6e,0x4d,0xa0,0x42,0xa9,0x10,0x9c,0x43,0x07,0xb7,
1240 0x40,0xd7,0x43,0xa9,0x10,0x9c,0x43,0x07,0x79,0xcb,0x11,0x43,0x62,0xbf,0xd7,0x42,0x09,0x06,0x98,0x42,
1241 0x74,0x43,0xb1,0x8d,0x68,0x43,0x08,0xd7,0x24,0x79,0x43,0xba,0x83,0x6e,0x43,0xa9,0x16,0x7c,0x43,0x56,
1242 0xa1,0x76,0x43,0x74,0x2a,0x7d,0x43,0x44,0x73,0x80,0x43,0x08,0x55,0xd1,0x7e,0x43,0xe3,0xea,0x76,0x43,
1243 0xbc,0x18,0x81,0x43,0x7f,0xa8,0x6e,0x43,0x8f,0x0a,0x84,0x43,0x02,0xfc,0x68,0x43,0x09,0x06,0x92,0x29,
1244 0x8d,0x43,0x73,0xc3,0x67,0x43,0x08,0xa4,0xd9,0x8e,0x43,0xf2,0xa6,0x7a,0x43,0x8f,0x22,0x88,0x43,0x75,
1245 0x2a,0x7d,0x43,0x42,0x7f,0x82,0x43,0x08,0xc8,0x88,0x43,0x09,0x06,0xc1,0x79,0x74,0x43,0x50,0x64,0x89,
1246 0x43,0x08,0x68,0x2d,0x72,0x43,0xee,0x21,0x81,0x43,0xcd,0x97,0x55,0x43,0xe6,0xf1,0x7b,0x43,0x91,0xec,
1247 0x5d,0x43,0xa8,0xc7,0x6a,0x43,0x09,0x06,0xfa,0xa5,0x52,0x43,0x60,0x97,0x7c,0x43,0x08,0x19,0xff,0x50,
1248 0x43,0xe9,0x6e,0x8a,0x43,0xb0,0xbd,0x70,0x43,0x4c,0x51,0x82,0x43,0x04,0xeb,0x69,0x43,0x66,0x0f,0x8e,
1249 0x43,0x09,0x06,0x17,0xbf,0x71,0x43,0x2c,0x58,0x94,0x43,0x08,0x1c,0x96,0x6e,0x43,0x61,0x68,0x99,0x43,
1250 0x2d,0x3a,0x6e,0x43,0xc8,0x81,0x9e,0x43,0xb7,0x9b,0x72,0x43,0x61,0xa4,0xa3,0x43,0x09,0x06,0x30,0xdb,
1251 0x82,0x43,0xdb,0xe9,0x93,0x43,0x08,0x11,0x82,0x84,0x43,0x61,0x68,0x99,0x43,0xe8,0x4a,0x84,0x43,0x8e,
1252 0xa6,0x9e,0x43,0x42,0x7f,0x82,0x43,0x61,0xa4,0xa3,0x43,0x09,0x06,0xc4,0x02,0x85,0x43,0xd1,0x0b,0x92,
1253 0x43,0x08,0xd6,0xb2,0x86,0x43,0x34,0x1e,0x92,0x43,0x4f,0x58,0x87,0x43,0xa4,0xf1,0x92,0x43,0x03,0xd9,
1254 0x87,0x43,0x7b,0xc6,0x94,0x43,0x09,0x06,0x87,0x3e,0x64,0x43,0x31,0x3b,0x93,0x43,0x08,0x3b,0xbf,0x64,
1255 0x43,0x6f,0xf9,0x91,0x43,0x96,0x0b,0x67,0x43,0xc5,0x4a,0x91,0x43,0xcf,0xfe,0x6a,0x43,0x31,0x2f,0x91,
1256 0x43,0x09,0x06,0x16,0x74,0xb5,0x43,0x08,0xec,0x8e,0x43,0x08,0x1b,0x4b,0xb2,0x43,0xee,0x5d,0x8b,0x43,
1257 0x48,0x4d,0xad,0x43,0x12,0xa6,0x8a,0x43,0xf3,0xd7,0xa7,0x43,0x74,0xb8,0x8a,0x43,0x08,0x8c,0xb2,0xa0,
1258 0x43,0xcd,0xf8,0x8a,0x43,0x68,0x46,0x9b,0x43,0x79,0x8f,0x87,0x43,0x49,0xc9,0x96,0x43,0xe9,0x3e,0x82,
1259 0x43,0x08,0x60,0x5c,0x97,0x43,0xa1,0xde,0x8b,0x43,0x4e,0xa0,0x93,0x43,0x31,0x3b,0x93,0x43,0x9f,0xea,
1260 0x8d,0x43,0x27,0x8d,0x99,0x43,0x08,0x07,0xe0,0x8c,0x43,0x06,0x34,0x9b,0x43,0x38,0xe9,0x8c,0x43,0x46,
1261 0x0a,0x9e,0x43,0x3d,0xcc,0x8b,0x43,0xb2,0x06,0xa2,0x43,0x08,0xf1,0x40,0x8a,0x43,0xb0,0x12,0xa4,0x43,
1262 0x39,0xd1,0x88,0x43,0x76,0x43,0xa6,0x43,0xfa,0x06,0x88,0x43,0xa4,0x75,0xa9,0x43,0x08,0x19,0x6c,0x88,
1263 0x43,0x9f,0x9e,0xac,0x43,0x66,0xeb,0x87,0x43,0x44,0x76,0xb0,0x43,0x6b,0xce,0x86,0x43,0x3b,0xbc,0xb4,
1264 0x43,0x08,0xa9,0x8c,0x85,0x43,0x06,0xd0,0xb5,0x43,0xfa,0xee,0x83,0x43,0x74,0xa3,0xb6,0x43,0x3d,0x90,
1265 0x81,0x43,0x31,0xf6,0xb6,0x43,0x08,0x9d,0x61,0x7d,0x43,0xee,0x48,0xb7,0x43,0x3b,0x1f,0x75,0x43,0xcf,
1266 0xe3,0xb6,0x43,0xee,0x6f,0x6d,0x43,0x68,0xe2,0xb5,0x43,0x08,0xd4,0xed,0x6b,0x43,0x87,0x2f,0xb2,0x43,
1267 0x0e,0xc9,0x6b,0x43,0xa7,0x7c,0xae,0x43,0x98,0xfa,0x67,0x43,0xab,0x53,0xab,0x43,0x08,0x25,0x2c,0x64,
1268 0x43,0x33,0xa2,0xa8,0x43,0x40,0x96,0x61,0x43,0xc3,0xc2,0xa5,0x43,0x64,0xde,0x60,0x43,0xfa,0xa2,0xa2,
1269 0x43,0x08,0xb0,0x5d,0x60,0x43,0x06,0x4c,0x9f,0x43,0x9a,0xca,0x5f,0x43,0x38,0x3d,0x9b,0x43,0x3b,0x8f,
1270 0x5c,0x43,0x85,0xb0,0x98,0x43,0x08,0x42,0x36,0x51,0x43,0x3d,0xf0,0x91,0x43,0xcd,0x4f,0x49,0x43,0xdb,
1271 0xb9,0x8b,0x43,0xe0,0xdb,0x44,0x43,0x42,0x8b,0x84,0x43,0x08,0x7e,0xc9,0x44,0x43,0x8a,0x57,0x8d,0x43,
1272 0xbc,0x6c,0x0f,0x43,0x23,0x62,0x8e,0x43,0xf5,0x17,0x07,0x43,0xc5,0x3e,0x8f,0x43,0x09,0x06,0xe0,0xea,
1273 0x76,0x43,0xab,0xef,0xc5,0x43,0x08,0x12,0x00,0x79,0x43,0xab,0xcb,0xbf,0x43,0x79,0xb9,0x6d,0x43,0x7e,
1274 0x8d,0xba,0x43,0xee,0x6f,0x6d,0x43,0x98,0xeb,0xb5,0x43,0x08,0xe0,0x02,0x7b,0x43,0x5f,0x1c,0xb8,0x43,
1275 0x85,0x2c,0x82,0x43,0xe9,0x65,0xb8,0x43,0xd6,0xb2,0x86,0x43,0xc6,0x05,0xb5,0x43,0x08,0x03,0xcd,0x85,
1276 0x43,0x5a,0x39,0xb9,0x43,0xe4,0x4f,0x81,0x43,0xdb,0xd4,0xbf,0x43,0xdf,0x6c,0x82,0x43,0xbc,0x93,0xc5,
1277 0x43,0x09,0x06,0xf0,0xd0,0x22,0x43,0x5d,0x19,0x08,0x43,0x08,0xbc,0xab,0x49,0x43,0x4a,0x35,0x29,0x43,
1278 0xcb,0xf7,0x65,0x43,0xce,0x37,0x45,0x43,0x0e,0x99,0x63,0x43,0x67,0xc6,0x5c,0x43,0x09,0x06,0x05,0x94,
1279 0xab,0x43,0xc2,0x13,0x04,0x43,0x08,0x9f,0x26,0x98,0x43,0x11,0x42,0x25,0x43,0x97,0x00,0x8a,0x43,0x32,
1280 0x32,0x41,0x43,0xf5,0x2f,0x8b,0x43,0xc7,0xc0,0x58,0x43,0x09,0x06,0x8f,0x85,0x48,0x43,0xe0,0xa8,0x8c,
1281 0x43,0x08,0x55,0xaa,0x48,0x43,0xe0,0xa8,0x8c,0x43,0x6b,0x3d,0x49,0x43,0xc1,0x43,0x8c,0x43,0x31,0x62,
1282 0x49,0x43,0xc1,0x43,0x8c,0x43,0x08,0x2f,0xe3,0x2f,0x43,0xad,0xe7,0x98,0x43,0xff,0x0d,0x0d,0x43,0xad,
1283 0xf3,0x9a,0x43,0xf0,0xaf,0xcc,0x42,0x74,0x00,0x97,0x43,0x08,0xbb,0xa2,0xf7,0x42,0x93,0x4d,0x93,0x43,
1284 0x5e,0x19,0x08,0x43,0x5a,0x2a,0x87,0x43,0x23,0x6e,0x10,0x43,0x42,0x97,0x86,0x43,0x08,0xca,0xe8,0x33,
1285 0x43,0x1b,0x3c,0x80,0x43,0x80,0xe8,0x4d,0x43,0xda,0xf4,0x70,0x43,0xae,0x0e,0x4f,0x43,0x2b,0x1b,0x65,
1286 0x43,0x08,0x66,0x96,0x54,0x43,0xa3,0xe1,0x3b,0x43,0x4e,0xc4,0x19,0x43,0xa0,0x1a,0x16,0x43,0x10,0xe2,
1287 0x14,0x43,0x26,0x14,0xe0,0x42,0x08,0x5c,0x91,0x1c,0x43,0xcb,0x27,0xee,0x42,0xa9,0x40,0x24,0x43,0x71,
1288 0x3b,0xfc,0x42,0xf3,0xef,0x2b,0x43,0x8b,0x27,0x05,0x43,0x08,0xe2,0x4b,0x2c,0x43,0x48,0x86,0x07,0x43,
1289 0x79,0x62,0x2f,0x43,0x05,0xe5,0x09,0x43,0x55,0x32,0x34,0x43,0xa0,0xd2,0x09,0x43,0x08,0x74,0xa3,0x36,
1290 0x43,0x3a,0xd1,0x08,0x43,0x7e,0x81,0x38,0x43,0x09,0xd4,0x0a,0x43,0x0d,0xba,0x39,0x43,0xa0,0xea,0x0d,
1291 0x43,0x08,0x6f,0xe4,0x3d,0x43,0x43,0xc7,0x0e,0x43,0xd6,0xe5,0x3e,0x43,0xc4,0x4a,0x11,0x43,0x55,0x7a,
1292 0x40,0x43,0x59,0x72,0x13,0x43,0x08,0x55,0x92,0x44,0x43,0xbf,0x73,0x14,0x43,0x23,0x95,0x46,0x43,0xa5,
1293 0x09,0x17,0x43,0xe0,0xf3,0x48,0x43,0xfe,0x55,0x19,0x43,0x08,0xcd,0x4f,0x49,0x43,0xaa,0x10,0x1c,0x43,
1294 0x61,0x77,0x4b,0x43,0xfe,0x6d,0x1d,0x43,0x80,0xe8,0x4d,0x43,0x2b,0x94,0x1e,0x43,0x08,0x58,0xc9,0x51,
1295 0x43,0x41,0x27,0x1f,0x43,0x9b,0x82,0x53,0x43,0x35,0x72,0x20,0x43,0x53,0xf2,0x54,0x43,0x88,0xcf,0x21,
1296 0x43,0x08,0x7b,0x29,0x55,0x43,0xe8,0x0a,0x25,0x43,0xb2,0x2d,0x58,0x43,0xef,0xe8,0x26,0x43,0x9b,0xb2,
1297 0x5b,0x43,0xd0,0x8f,0x28,0x43,0x08,0x5f,0xef,0x5f,0x43,0xeb,0x11,0x2a,0x43,0xfd,0xdc,0x5f,0x43,0x6e,
1298 0x95,0x2c,0x43,0x3b,0xa7,0x60,0x43,0x2b,0xf4,0x2e,0x43,0x08,0x06,0xbb,0x61,0x43,0xfd,0xe5,0x31,0x43,
1299 0xe7,0x61,0x63,0x43,0xef,0x30,0x33,0x43,0x53,0x52,0x65,0x43,0xa3,0xb1,0x33,0x43,0x08,0x12,0xa0,0x68,
1300 0x43,0x7f,0x69,0x34,0x43,0x40,0xc6,0x69,0x43,0x64,0xff,0x36,0x43,0x7e,0x90,0x6a,0x43,0x71,0xcc,0x39,
1301 0x43,0x08,0xbc,0x5a,0x6b,0x43,0x51,0x73,0x3b,0x43,0xc1,0x49,0x6c,0x43,0xa5,0xd0,0x3c,0x43,0xe0,0xba,
1302 0x6e,0x43,0xb8,0x74,0x3c,0x43,0x08,0x6b,0x1c,0x73,0x43,0x13,0xc1,0x3e,0x43,0x40,0xf6,0x71,0x43,0xce,
1303 0x1f,0x41,0x43,0x55,0x89,0x72,0x43,0x8d,0x7e,0x43,0x43,0x08,0x68,0x2d,0x72,0x43,0x89,0xae,0x4b,0x43,
1304 0xc1,0x79,0x74,0x43,0xcb,0x78,0x4c,0x43,0x55,0xa1,0x76,0x43,0x5b,0xb1,0x4d,0x43,0x08,0xa2,0x38,0x7a,
1305 0x43,0xd1,0x56,0x4e,0x43,0x85,0xb6,0x78,0x43,0xb1,0x15,0x54,0x43,0x83,0xc7,0x77,0x43,0x89,0x0e,0x5c,
1306 0x43,0x08,0xcf,0x46,0x77,0x43,0x0f,0x81,0x5f,0x43,0x1a,0xde,0x7a,0x43,0xce,0xc7,0x5d,0x43,0x42,0x73,
1307 0x80,0x43,0x99,0xc3,0x5a,0x43,0x08,0x85,0x2c,0x82,0x43,0xf6,0xe6,0x59,0x43,0x81,0x3d,0x81,0x43,0x16,
1308 0x10,0x50,0x43,0xd6,0x8e,0x80,0x43,0x5b,0x99,0x49,0x43,0x08,0xc4,0xea,0x80,0x43,0x22,0x95,0x46,0x43,
1309 0xfa,0xe2,0x81,0x43,0xda,0xec,0x43,0x43,0x78,0x77,0x83,0x43,0xe4,0xb2,0x41,0x43,0x08,0x8a,0x27,0x85,
1310 0x43,0x86,0x77,0x3e,0x43,0x0c,0x9f,0x85,0x43,0x07,0xf4,0x3b,0x43,0x8f,0x16,0x86,0x43,0xe6,0x82,0x39,
1311 0x43,0x08,0x85,0x44,0x86,0x43,0x37,0xd9,0x35,0x43,0x1e,0x4f,0x87,0x43,0xe1,0x7b,0x34,0x43,0xdf,0x90,
1312 0x88,0x43,0xb6,0x55,0x33,0x43,0x08,0xae,0x93,0x8a,0x43,0xfd,0xe5,0x31,0x43,0xfa,0x12,0x8a,0x43,0xbf,
1313 0x03,0x2d,0x43,0x19,0x78,0x8a,0x43,0x45,0x5e,0x2c,0x43,0x08,0x03,0xf1,0x8b,0x43,0xac,0x47,0x29,0x43,
1314 0x2f,0x17,0x8d,0x43,0x45,0x46,0x28,0x43,0xc8,0x21,0x8e,0x43,0x30,0xb3,0x27,0x43,0x08,0xa9,0xc8,0x8f,
1315 0x43,0xef,0xe8,0x26,0x43,0xbf,0x5b,0x90,0x43,0x5b,0xc1,0x24,0x43,0x10,0xca,0x90,0x43,0xa0,0x62,0x22,
1316 0x43,0x08,0x26,0x5d,0x91,0x43,0xbb,0xcc,0x1f,0x43,0xf0,0x70,0x92,0x43,0x78,0x13,0x1e,0x43,0x77,0xd7,
1317 0x93,0x43,0x73,0x24,0x1d,0x43,0x08,0x65,0x3f,0x96,0x43,0xce,0x58,0x1b,0x43,0xbe,0x7f,0x96,0x43,0xbf,
1318 0x8b,0x18,0x43,0x60,0x5c,0x97,0x43,0xb6,0xad,0x16,0x43,0x08,0xba,0xa8,0x99,0x43,0x78,0xcb,0x11,0x43,
1319 0x49,0xe1,0x9a,0x43,0x78,0xcb,0x11,0x43,0x01,0x51,0x9c,0x43,0x73,0xdc,0x10,0x43,0x08,0x72,0x24,0x9d,
1320 0x43,0xd2,0xff,0x0f,0x43,0x1c,0xd3,0x9d,0x43,0x07,0xec,0x0e,0x43,0xeb,0xc9,0x9d,0x43,0xe8,0x7a,0x0c,
1321 0x43,0x08,0x60,0x80,0x9d,0x43,0xd7,0xbe,0x08,0x43,0x4d,0xe8,0x9f,0x43,0x86,0x50,0x08,0x43,0x25,0xbd,
1322 0xa1,0x43,0x5b,0x2a,0x07,0x43,0x08,0x99,0x7f,0xa3,0x43,0xc9,0xf1,0x05,0x43,0x48,0x1d,0xa5,0x43,0x86,
1323 0x38,0x04,0x43,0x6c,0x71,0xa6,0x43,0x18,0x59,0x01,0x43,0x08,0x32,0x96,0xa6,0x43,0x6e,0x64,0xff,0x42,
1324 0x48,0x29,0xa7,0x43,0xed,0xcf,0xfd,0x42,0x5f,0xbc,0xa7,0x43,0x71,0x3b,0xfc,0x42,0x08,0xf3,0xe3,0xa9,
1325 0x43,0xf7,0x7d,0xf7,0x42,0xd8,0x6d,0xaa,0x43,0x45,0xe5,0xf2,0x42,0x48,0x41,0xab,0x43,0xcb,0x27,0xee,
1326 0x42,0x08,0x24,0xf9,0xab,0x43,0x52,0x6a,0xe9,0x42,0xee,0x0c,0xad,0x43,0x4c,0x8c,0xe7,0x42,0x1b,0x33,
1327 0xae,0x43,0xcc,0xf7,0xe5,0x42,0x08,0xaa,0x6b,0xaf,0x43,0xe8,0x61,0xe3,0x42,0x90,0xf5,0xaf,0x43,0xc9,
1328 0xf0,0xe0,0x42,0xe0,0x63,0xb0,0x43,0xe5,0x5a,0xde,0x42,0x08,0xaa,0x83,0xb3,0x43,0x29,0x2d,0x09,0x43,
1329 0x6a,0xfe,0x8e,0x43,0xb8,0x74,0x3c,0x43,0xd5,0x06,0x95,0x43,0xe6,0x79,0x67,0x43,0x08,0x2f,0x53,0x97,
1330 0x43,0xe9,0xb0,0x74,0x43,0xa8,0x28,0xa0,0x43,0x43,0xfd,0x76,0x43,0x83,0x28,0xad,0x43,0x17,0x59,0x81,
1331 0x43,0x08,0x3d,0xe7,0xbf,0x43,0x4b,0x8d,0x8c,0x43,0xae,0x96,0xba,0x43,0x66,0x27,0x92,0x43,0x15,0xe0,
1332 0xc7,0x43,0x6f,0x11,0x96,0x43,0x08,0x7e,0x5d,0xb2,0x43,0xdb,0x01,0x98,0x43,0x9e,0x56,0xa0,0x43,0x80,
1333 0xc1,0x97,0x43,0x69,0x2e,0x97,0x43,0x31,0x17,0x8d,0x43,0x09,0x06,0xab,0xa7,0x39,0x43,0x67,0x0f,0x0e,
1334 0x43,0x08,0xdb,0xbc,0x3b,0x43,0xe8,0x92,0x10,0x43,0xb5,0x85,0x3b,0x43,0x97,0x3c,0x14,0x43,0xab,0xa7,
1335 0x39,0x43,0x0c,0x0b,0x18,0x43,0x09,0x06,0xca,0x30,0x40,0x43,0x30,0x3b,0x13,0x43,0x08,0x17,0xc8,0x43,
1336 0x43,0xa5,0x09,0x17,0x43,0x7e,0xc9,0x44,0x43,0x1a,0xd8,0x1a,0x43,0x9d,0x22,0x43,0x43,0x8d,0xa6,0x1e,
1337 0x43,0x09,0x06,0xc8,0x78,0x4c,0x43,0xed,0xc9,0x1d,0x43,0x08,0x0b,0x32,0x4e,0x43,0x22,0xce,0x20,0x43,
1338 0x23,0xc5,0x4e,0x43,0x58,0xd2,0x23,0x43,0x0b,0x32,0x4e,0x43,0x2b,0xc4,0x26,0x43,0x09,0x06,0xec,0x08,
1339 0x58,0x43,0xc7,0xb1,0x26,0x43,0x08,0x02,0x9c,0x58,0x43,0xef,0x00,0x2b,0x43,0xd9,0x64,0x58,0x43,0x02,
1340 0xbd,0x2e,0x43,0x10,0x51,0x57,0x43,0x37,0xc1,0x31,0x43,0x09,0x06,0xcb,0xdf,0x61,0x43,0x4a,0x65,0x31,
1341 0x43,0x08,0xbe,0x2a,0x63,0x43,0xbd,0x33,0x35,0x43,0x32,0xe1,0x62,0x43,0x56,0x4a,0x38,0x43,0xde,0x83,
1342 0x61,0x43,0x3c,0xe0,0x3a,0x43,0x09,0x06,0x1c,0x7e,0x6a,0x43,0x5b,0x39,0x39,0x43,0x08,0x31,0x11,0x6b,
1343 0x43,0x0c,0xd2,0x3d,0x43,0x1c,0x7e,0x6a,0x43,0x13,0xd9,0x42,0x43,0xd9,0xc4,0x68,0x43,0xcb,0x60,0x48,
1344 0x43,0x09,0x06,0xe5,0xc1,0x73,0x43,0x16,0xf8,0x4b,0x43,0x08,0xa6,0xf7,0x72,0x43,0xb1,0xfd,0x4f,0x43,
1345 0x3b,0x07,0x71,0x43,0x4a,0x14,0x53,0x43,0xa2,0xf0,0x6d,0x43,0x7c,0x29,0x55,0x43,0x09,0x06,0x00,0x8d,
1346 0xa6,0x43,0xef,0x21,0x01,0x43,0x08,0x52,0xfb,0xa6,0x43,0xce,0xc8,0x02,0x43,0xe6,0x16,0xa7,0x43,0x51,
1347 0x4c,0x05,0x43,0x3b,0x68,0xa6,0x43,0x4c,0x75,0x08,0x43,0x09,0x06,0xde,0x20,0xa1,0x43,0x86,0x50,0x08,
1348 0x43,0x08,0xd4,0x4e,0xa1,0x43,0xd3,0xe7,0x0b,0x43,0xb5,0xe9,0xa0,0x43,0x59,0x5a,0x0f,0x43,0xba,0xcc,
1349 0x9f,0x43,0x54,0x83,0x12,0x43,0x09,0x06,0x77,0xfb,0x99,0x43,0x6c,0x16,0x13,0x43,0x08,0xde,0xfc,0x9a,
1350 0x43,0x4a,0xbd,0x14,0x43,0x06,0x34,0x9b,0x43,0xfe,0x55,0x19,0x43,0x13,0xe9,0x99,0x43,0x41,0x27,0x1f,
1351 0x43,0x09,0x06,0x46,0xce,0x93,0x43,0x26,0xa5,0x1d,0x43,0x08,0xe7,0xaa,0x94,0x43,0xbb,0xcc,0x1f,0x43,
1352 0x18,0xb4,0x94,0x43,0xa8,0x40,0x24,0x43,0xe2,0xbb,0x93,0x43,0x21,0xfe,0x28,0x43,0x09,0x06,0xb1,0x8e,
1353 0x8d,0x43,0xa8,0x58,0x28,0x43,0x08,0x19,0x90,0x8e,0x43,0x54,0x13,0x2b,0x43,0xa4,0xd9,0x8e,0x43,0x84,
1354 0x40,0x31,0x43,0x46,0xaa,0x8d,0x43,0x29,0x24,0x37,0x43,0x09,0x06,0xd6,0xbe,0x88,0x43,0xef,0x30,0x33,
1355 0x43,0x08,0x0c,0xb7,0x89,0x43,0x0e,0xa2,0x35,0x43,0xc0,0x37,0x8a,0x43,0x7a,0xaa,0x3b,0x43,0xbb,0x48,
1356 0x89,0x43,0xbb,0x7b,0x41,0x43,0x09,0x06,0x3a,0xad,0x82,0x43,0xc4,0x59,0x43,0x43,0x08,0xd2,0xb7,0x83,
1357 0x43,0x2b,0x5b,0x44,0x43,0x35,0xd6,0x85,0x43,0x48,0xf5,0x49,0x43,0x42,0x97,0x86,0x43,0xc4,0xa1,0x4f,
1358 0x43,0x09,0x06,0x9c,0xb3,0x80,0x43,0x48,0x55,0x5a,0x43,0x08,0xff,0xc5,0x80,0x43,0x09,0x73,0x55,0x43,
1359 0x93,0xe1,0x80,0x43,0x0f,0x39,0x53,0x43,0xf1,0xbe,0x7e,0x43,0x18,0xe7,0x4c,0x43,0x09,0x06,0xe0,0x02,
1360 0x7b,0x43,0x92,0xec,0x5d,0x43,0x08,0x09,0x3a,0x7b,0x43,0xf0,0xf7,0x58,0x43,0x09,0x3a,0x7b,0x43,0xe6,
1361 0x31,0x5b,0x43,0xe0,0x02,0x7b,0x43,0xa8,0x4f,0x56,0x43,0x09,0x06,0x39,0x4f,0x7d,0x43,0x3e,0x8f,0x5c,
1362 0x43,0x08,0xe9,0xe0,0x7c,0x43,0x03,0x9c,0x58,0x43,0x1e,0x2b,0x81,0x43,0x7f,0x30,0x5a,0x43,0xff,0x73,
1363 0x7d,0x43,0xf6,0xb6,0x51,0x43,0x09,0x06,0x5c,0xb8,0x52,0x43,0x28,0x21,0x87,0x43,0x08,0xae,0x3e,0x57,
1364 0x43,0x12,0x9a,0x88,0x43,0x23,0xf5,0x56,0x43,0x04,0xf1,0x8b,0x43,0x25,0xfc,0x5b,0x43,0x85,0x74,0x8e,
1365 0x43,0x08,0x2f,0xf2,0x61,0x43,0x8e,0x52,0x90,0x43,0xd9,0xdc,0x6c,0x43,0x85,0x74,0x8e,0x43,0xc6,0x20,
1366 0x69,0x43,0x3d,0xd8,0x8d,0x43,0x08,0x6d,0x8c,0x5a,0x43,0xf5,0x3b,0x8d,0x43,0x3d,0x77,0x58,0x43,0xa1,
1367 0xc6,0x87,0x43,0xf8,0xed,0x5e,0x43,0x5e,0x0d,0x86,0x43,0x09,0x06,0xde,0xcc,0x92,0x43,0xf7,0x17,0x87,
1368 0x43,0x08,0xb6,0x89,0x90,0x43,0xae,0x87,0x88,0x43,0x4a,0xa5,0x90,0x43,0xa1,0xde,0x8b,0x43,0xf9,0x2a,
1369 0x8e,0x43,0x23,0x62,0x8e,0x43,0x08,0xf5,0x2f,0x8b,0x43,0x5c,0x49,0x90,0x43,0x35,0xd6,0x85,0x43,0x8e,
1370 0x46,0x8e,0x43,0x3d,0xb4,0x87,0x43,0x47,0xaa,0x8d,0x43,0x08,0x6a,0xfe,0x8e,0x43,0xff,0x0d,0x8d,0x43,
1371 0xbb,0x6c,0x8f,0x43,0xf7,0x17,0x87,0x43,0x5c,0x31,0x8c,0x43,0xb2,0x5e,0x85,0x43,0x09,0x06,0x60,0x38,
1372 0x91,0x43,0x69,0x5d,0x7a,0x43,0x08,0x34,0x1e,0x92,0x43,0x1e,0x5b,0x89,0x43,0x04,0x63,0x7e,0x43,0x5e,
1373 0x01,0x84,0x43,0x59,0x2a,0x87,0x43,0x0d,0xcf,0x8d,0x43,0x09,0x03,0x04,0x06,0x5a,0x18,0x63,0x43,0x82,
1374 0x79,0x8b,0x43,0x08,0x25,0x2c,0x64,0x43,0x82,0x79,0x8b,0x43,0x2a,0x1b,0x65,0x43,0x9d,0xef,0x8a,0x43,
1375 0x2a,0x1b,0x65,0x43,0xc1,0x37,0x8a,0x43,0x08,0x2a,0x1b,0x65,0x43,0x17,0x89,0x89,0x43,0x25,0x2c,0x64,
1376 0x43,0x31,0xff,0x88,0x43,0x5a,0x18,0x63,0x43,0x31,0xff,0x88,0x43,0x08,0xf3,0x16,0x62,0x43,0x31,0xff,
1377 0x88,0x43,0xee,0x27,0x61,0x43,0x17,0x89,0x89,0x43,0xee,0x27,0x61,0x43,0xc1,0x37,0x8a,0x43,0x08,0xee,
1378 0x27,0x61,0x43,0x9d,0xef,0x8a,0x43,0xf3,0x16,0x62,0x43,0x82,0x79,0x8b,0x43,0x5a,0x18,0x63,0x43,0x82,
1379 0x79,0x8b,0x43,0x09,0x06,0x4f,0x64,0x89,0x43,0x82,0x79,0x8b,0x43,0x08,0x34,0xee,0x89,0x43,0x82,0x79,
1380 0x8b,0x43,0x85,0x5c,0x8a,0x43,0x9d,0xef,0x8a,0x43,0x85,0x5c,0x8a,0x43,0xc1,0x37,0x8a,0x43,0x08,0x85,
1381 0x5c,0x8a,0x43,0x17,0x89,0x89,0x43,0x34,0xee,0x89,0x43,0x31,0xff,0x88,0x43,0x4f,0x64,0x89,0x43,0x31,
1382 0xff,0x88,0x43,0x08,0x9c,0xe3,0x88,0x43,0x31,0xff,0x88,0x43,0x19,0x6c,0x88,0x43,0x17,0x89,0x89,0x43,
1383 0x19,0x6c,0x88,0x43,0xc1,0x37,0x8a,0x43,0x08,0x19,0x6c,0x88,0x43,0x9d,0xef,0x8a,0x43,0x9c,0xe3,0x88,
1384 0x43,0x82,0x79,0x8b,0x43,0x4f,0x64,0x89,0x43,0x82,0x79,0x8b,0x43,0x09,0x02,0x04,0x06,0x19,0x60,0x86,
1385 0x43,0xec,0xed,0xa3,0x43,0x08,0x35,0xd6,0x85,0x43,0x76,0x43,0xa6,0x43,0x93,0xe1,0x80,0x43,0x57,0x02,
1386 0xac,0x43,0x61,0xd8,0x80,0x43,0x87,0x17,0xae,0x43,0x08,0xa5,0x85,0x80,0x43,0xc3,0xfe,0xaf,0x43,0xce,
1387 0xbc,0x80,0x43,0x83,0x40,0xb1,0x43,0xa5,0x91,0x82,0x43,0x79,0x6e,0xb1,0x43,0x08,0x23,0x26,0x84,0x43,
1388 0x40,0x93,0xb1,0x43,0x30,0xe7,0x84,0x43,0xbe,0x1b,0xb1,0x43,0x11,0x82,0x84,0x43,0xab,0x6b,0xaf,0x43,
1389 0x08,0xb7,0x41,0x84,0x43,0x3b,0x98,0xae,0x43,0xb7,0x41,0x84,0x43,0xc3,0xf2,0xad,0x43,0xa1,0xae,0x83,
1390 0x43,0x83,0x28,0xad,0x43,0x08,0xb2,0x52,0x83,0x43,0x80,0x39,0xac,0x43,0x81,0x49,0x83,0x43,0xf0,0x00,
1391 0xab,0x43,0xe4,0x67,0x85,0x43,0x76,0x4f,0xa8,0x43,0x08,0x9c,0xd7,0x86,0x43,0xd1,0x83,0xa6,0x43,0xec,
1392 0x45,0x87,0x43,0x01,0x75,0xa2,0x43,0x19,0x60,0x86,0x43,0xec,0xed,0xa3,0x43,0x09,0x06,0xd9,0xdc,0x6c,
1393 0x43,0x14,0x25,0xa4,0x43,0x08,0xa2,0xf0,0x6d,0x43,0x9f,0x7a,0xa6,0x43,0x47,0xec,0x77,0x43,0x80,0x39,
1394 0xac,0x43,0xa9,0xfe,0x77,0x43,0xb0,0x4e,0xae,0x43,0x08,0x23,0xa4,0x78,0x43,0xea,0x35,0xb0,0x43,0xd2,
1395 0x35,0x78,0x43,0xab,0x77,0xb1,0x43,0xc1,0x79,0x74,0x43,0xa2,0xa5,0xb1,0x43,0x08,0xc6,0x50,0x71,0x43,
1396 0x68,0xca,0xb1,0x43,0xab,0xce,0x6f,0x43,0xe7,0x52,0xb1,0x43,0xea,0x98,0x70,0x43,0xd4,0xa2,0xaf,0x43,
1397 0x08,0x9d,0x19,0x71,0x43,0x96,0xd8,0xae,0x43,0x9d,0x19,0x71,0x43,0xec,0x29,0xae,0x43,0xca,0x3f,0x72,
1398 0x43,0xab,0x5f,0xad,0x43,0x08,0xa6,0xf7,0x72,0x43,0xa7,0x70,0xac,0x43,0x09,0x0a,0x73,0x43,0x17,0x38,
1399 0xab,0x43,0x44,0xcd,0x6e,0x43,0x9f,0x86,0xa8,0x43,0x08,0xd4,0xed,0x6b,0x43,0xf8,0xba,0xa6,0x43,0x31,
1400 0x11,0x6b,0x43,0x2a,0xac,0xa2,0x43,0xd9,0xdc,0x6c,0x43,0x14,0x25,0xa4,0x43,0x09,0x01,0x05,0x06,0x66,
1401 0x5d,0x7a,0x43,0x74,0xeb,0xc2,0x43,0x08,0x09,0x22,0x77,0x43,0x50,0xbb,0xc7,0x43,0xe9,0xe0,0x7c,0x43,
1402 0xf5,0x86,0xc9,0x43,0x8f,0x94,0x7a,0x43,0xc5,0x95,0xcd,0x43,0x09,0x06,0x08,0x98,0x80,0x43,0x6b,0x19,
1403 0xc3,0x43,0x08,0xb7,0x35,0x82,0x43,0x79,0xf2,0xc7,0x43,0xf1,0xbe,0x7e,0x43,0x1e,0xbe,0xc9,0x43,0x73,
1404 0x7c,0x80,0x43,0xec,0xcc,0xcd,0x43,0x09,0x06,0x28,0xab,0x7d,0x43,0xae,0xde,0xc6,0x43,0x08,0x1e,0xcd,
1405 0x7b,0x43,0x8a,0xa2,0xc9,0x43,0x30,0x89,0x7f,0x43,0x5c,0x94,0xcc,0x43,0x28,0xab,0x7d,0x43,0x42,0x2a,
1406 0xcf,0x43,0x09,0x01,0x05,0x06,0x24,0x14,0xe0,0x42,0xf5,0x77,0x97,0x43,0x08,0xf7,0x1d,0xe7,0x42,0x74,
1407 0x00,0x97,0x43,0x4d,0x93,0xec,0x42,0xdb,0xf5,0x95,0x43,0x29,0x4b,0xed,0x42,0xcd,0x34,0x95,0x43,0x09,
1408 0x06,0x29,0x7b,0xf5,0x42,0x6f,0x1d,0x98,0x43,0x08,0xe4,0xf1,0xfb,0x42,0x61,0x5c,0x97,0x43,0xdb,0x7d,
1409 0x01,0x43,0xb2,0xbe,0x95,0x43,0x55,0x23,0x02,0x43,0xe7,0xaa,0x94,0x43,0x09,0x06,0x98,0xdc,0x03,0x43,
1410 0xbe,0x8b,0x98,0x43,0x08,0x66,0xdf,0x05,0x43,0x47,0xe6,0x97,0x43,0xae,0x87,0x08,0x43,0x98,0x48,0x96,
1411 0x43,0x61,0x08,0x09,0x43,0xd6,0x06,0x95,0x43,0x09,0x06,0x31,0x0b,0x0b,0x43,0x8e,0x82,0x98,0x43,0x08,
1412 0xdb,0xc5,0x0d,0x43,0x80,0xc1,0x97,0x43,0xd6,0xee,0x10,0x43,0xa9,0xec,0x95,0x43,0x79,0xcb,0x11,0x43,
1413 0x55,0x8f,0x94,0x43,0x09,0x06,0xd1,0x2f,0x18,0x43,0xdb,0x01,0x98,0x43,0x08,0xad,0xe7,0x18,0x43,0x38,
1414 0x25,0x97,0x43,0x8a,0x9f,0x19,0x43,0x80,0xb5,0x95,0x43,0xd6,0x1e,0x19,0x43,0xe0,0xd8,0x94,0x43,0x09,
1415 0x06,0x9a,0x5b,0x1d,0x43,0x58,0x8a,0x97,0x43,0x08,0x01,0x5d,0x1e,0x43,0xf1,0x88,0x96,0x43,0x2f,0x83,
1416 0x1f,0x43,0x19,0xb4,0x94,0x43,0x19,0xf0,0x1e,0x43,0x6f,0x05,0x94,0x43,0x09,0x06,0x0b,0x53,0x24,0x43,
1417 0xae,0xdb,0x96,0x43,0x08,0x25,0xd5,0x25,0x43,0x50,0xac,0x95,0x43,0x53,0xfb,0x26,0x43,0x8a,0x7b,0x93,
1418 0x43,0x76,0x43,0x26,0x43,0xb7,0x95,0x92,0x43,0x09,0x06,0x76,0x5b,0x2a,0x43,0x47,0xda,0x95,0x43,0x08,
1419 0xf3,0xef,0x2b,0x43,0x10,0xe2,0x94,0x43,0x6d,0x95,0x2c,0x43,0xae,0xc3,0x92,0x43,0x68,0xa6,0x2b,0x43,
1420 0x47,0xc2,0x91,0x43,0x09,0x06,0x36,0xc1,0x31,0x43,0x2c,0x58,0x94,0x43,0x08,0x8c,0x1e,0x33,0x43,0x31,
1421 0x3b,0x93,0x43,0x79,0x7a,0x33,0x43,0xff,0x25,0x91,0x43,0xd9,0x9d,0x32,0x43,0xc1,0x5b,0x90,0x43,0x09,
1422 0x06,0x25,0x35,0x36,0x43,0x31,0x3b,0x93,0x43,0x08,0x3f,0xb7,0x37,0x43,0xc1,0x67,0x92,0x43,0xe0,0x93,
1423 0x38,0x43,0xae,0xb7,0x90,0x43,0x7e,0x81,0x38,0x43,0x0d,0xdb,0x8f,0x43,0x09,0x06,0xb5,0x85,0x3b,0x43,
1424 0xe4,0xaf,0x91,0x43,0x08,0xcf,0x07,0x3d,0x43,0x9d,0x13,0x91,0x43,0xbc,0x63,0x3d,0x43,0x47,0xb6,0x8f,
1425 0x43,0xe5,0x9a,0x3d,0x43,0x74,0xd0,0x8e,0x43,0x09,0x06,0xae,0xc6,0x42,0x43,0xa4,0xd9,0x8e,0x43,0x08,
1426 0xca,0x48,0x44,0x43,0xfa,0x2a,0x8e,0x43,0xa2,0x11,0x44,0x43,0x9d,0xfb,0x8c,0x43,0x55,0x92,0x44,0x43,
1427 0x0d,0xc3,0x8b,0x43,0x09,0x06,0x39,0x10,0xc3,0x43,0x34,0x36,0x96,0x43,0x08,0x92,0x44,0xc1,0x43,0xe4,
1428 0xc7,0x95,0x43,0x6f,0xf0,0xbf,0x43,0x4b,0xbd,0x94,0x43,0x47,0xb9,0xbf,0x43,0x0b,0xf3,0x93,0x43,0x09,
1429 0x06,0x8f,0x49,0xbe,0x43,0xb7,0xad,0x96,0x43,0x08,0x11,0xb5,0xbc,0x43,0x77,0xe3,0x95,0x43,0x9c,0xf2,
1430 0xba,0x43,0xfa,0x4e,0x94,0x43,0xae,0x96,0xba,0x43,0x31,0x3b,0x93,0x43,0x09,0x06,0xdb,0xb0,0xb9,0x43,
1431 0x10,0xee,0x96,0x43,0x08,0x42,0xa6,0xb8,0x43,0xc8,0x51,0x96,0x43,0x50,0x5b,0xb7,0x43,0x19,0xb4,0x94,
1432 0x43,0xf7,0x1a,0xb7,0x43,0x58,0x72,0x93,0x43,0x09,0x06,0xf2,0x2b,0xb6,0x43,0x10,0xee,0x96,0x43,0x08,
1433 0x9d,0xce,0xb4,0x43,0x04,0x2d,0x96,0x43,0xed,0x30,0xb3,0x43,0x2c,0x58,0x94,0x43,0xce,0xcb,0xb2,0x43,
1434 0xd6,0xfa,0x92,0x43,0x09,0x06,0x5a,0x09,0xb1,0x43,0x19,0xc0,0x96,0x43,0x08,0x6c,0xad,0xb0,0x43,0x77,
1435 0xe3,0x95,0x43,0x7e,0x51,0xb0,0x43,0xc0,0x73,0x94,0x43,0xd8,0x91,0xb0,0x43,0x1e,0x97,0x93,0x43,0x09,
1436 0x06,0x48,0x4d,0xad,0x43,0xbe,0x7f,0x96,0x43,0x08,0x95,0xcc,0xac,0x43,0x58,0x7e,0x95,0x43,0x4d,0x30,
1437 0xac,0x43,0x80,0xa9,0x93,0x43,0xd8,0x79,0xac,0x43,0xd6,0xfa,0x92,0x43,0x09,0x06,0x90,0xd1,0xa9,0x43,
1438 0x14,0xd1,0x95,0x43,0x08,0x83,0x10,0xa9,0x43,0xb7,0xa1,0x94,0x43,0x3b,0x74,0xa8,0x43,0xf1,0x70,0x92,
1439 0x43,0x29,0xd0,0xa8,0x43,0x1e,0x8b,0x91,0x43,0x09,0x06,0x5a,0xcd,0xa6,0x43,0x8a,0x87,0x95,0x43,0x08,
1440 0x1c,0x03,0xa6,0x43,0x23,0x86,0x94,0x43,0x5f,0xb0,0xa5,0x43,0xc1,0x67,0x92,0x43,0xe1,0x27,0xa6,0x43,
1441 0x8a,0x6f,0x91,0x43,0x09,0x06,0xd4,0x5a,0xa3,0x43,0x2c,0x58,0x94,0x43,0x08,0x29,0xac,0xa2,0x43,0x31,
1442 0x3b,0x93,0x43,0x32,0x7e,0xa2,0x43,0xff,0x25,0x91,0x43,0x83,0xec,0xa2,0x43,0x8e,0x52,0x90,0x43,0x09,
1443 0x06,0xf8,0x96,0xa0,0x43,0x1e,0x97,0x93,0x43,0x08,0xeb,0xd5,0x9f,0x43,0x7b,0xba,0x92,0x43,0x99,0x67,
1444 0x9f,0x43,0x9d,0x13,0x91,0x43,0x99,0x67,0x9f,0x43,0xfa,0x36,0x90,0x43,0x09,0x06,0xeb,0xc9,0x9d,0x43,
1445 0xc8,0x39,0x92,0x43,0x08,0xde,0x08,0x9d,0x43,0xb2,0xa6,0x91,0x43,0xe6,0xda,0x9c,0x43,0x2c,0x40,0x90,
1446 0x43,0x52,0xbf,0x9c,0x43,0x5a,0x5a,0x8f,0x43,0x09,0x06,0x37,0x3d,0x9b,0x43,0x85,0x80,0x90,0x43,0x08,
1447 0x2a,0x7c,0x9a,0x43,0xdb,0xd1,0x8f,0x43,0xf0,0xa0,0x9a,0x43,0x7d,0xa2,0x8e,0x43,0x65,0x57,0x9a,0x43,
1448 0xee,0x69,0x8d,0x43,0x09,0x02,0x04,0x06,0x2a,0xf4,0x2e,0x42,0x04,0x21,0x94,0x43,0x08,0x0d,0x8a,0x31,
1449 0x42,0x9f,0x0e,0x94,0x43,0xf3,0x1f,0x34,0x42,0x3d,0xfc,0x93,0x43,0x63,0xff,0x36,0x42,0xa9,0xe0,0x93,
1450 0x43,0x08,0xb5,0x34,0x5d,0x42,0x0b,0xf3,0x93,0x43,0x6d,0xa4,0x5e,0x42,0x03,0x39,0x98,0x43,0xe7,0x31,
1451 0x5b,0x42,0x93,0x89,0x9d,0x43,0x08,0x02,0x9c,0x58,0x42,0xd4,0x5a,0xa3,0x43,0x38,0x70,0x53,0x42,0x14,
1452 0x49,0xaa,0x43,0xf8,0xed,0x5e,0x42,0x83,0x28,0xad,0x43,0x08,0xea,0x68,0x68,0x42,0x20,0x22,0xaf,0x43,
1453 0x12,0xb8,0x6c,0x42,0xb5,0x49,0xb1,0x43,0x2a,0x4b,0x6d,0x42,0x0d,0x96,0xb3,0x43,0x07,0x2a,0x4b,0x6d,
1454 0x42,0xc6,0x05,0xb5,0x43,0x08,0x87,0x6e,0x6c,0x42,0x68,0xee,0xb7,0x43,0x1c,0x66,0x66,0x42,0x31,0x0e,
1455 0xbb,0x43,0x57,0x11,0x5e,0x42,0x8f,0x49,0xbe,0x43,0x08,0x66,0x96,0x54,0x42,0xb9,0x5c,0xb8,0x43,0x2c,
1456 0x2b,0x3c,0x42,0x68,0xd6,0xb3,0x43,0x2a,0xf4,0x2e,0x42,0x6d,0xad,0xb0,0x43,0x07,0x2a,0xf4,0x2e,0x42,
1457 0x61,0xa4,0xa3,0x43,0x08,0x55,0x1a,0x30,0x42,0xf0,0xd0,0xa2,0x43,0xf8,0xf6,0x30,0x42,0xb2,0x06,0xa2,
1458 0x43,0x98,0xd3,0x31,0x42,0xd6,0x4e,0xa1,0x43,0x08,0x1c,0x6f,0x38,0x42,0x2a,0x94,0x9e,0x43,0xc1,0x22,
1459 0x36,0x42,0xf5,0x9b,0x9d,0x43,0x2a,0xf4,0x2e,0x42,0x6a,0x52,0x9d,0x43,0x07,0x2a,0xf4,0x2e,0x42,0x57,
1460 0xa2,0x9b,0x43,0x08,0xab,0x8f,0x35,0x42,0x8a,0xab,0x9b,0x43,0xe9,0x71,0x3a,0x42,0xb2,0xe2,0x9b,0x43,
1461 0xb7,0x74,0x3c,0x42,0x34,0x5a,0x9c,0x43,0x08,0x23,0x7d,0x42,0x42,0x0b,0x2f,0x9e,0x43,0xe5,0x9a,0x3d,
1462 0x42,0x38,0x6d,0xa3,0x43,0x36,0xd9,0x35,0x42,0xf3,0xd7,0xa7,0x43,0x08,0x12,0x61,0x2e,0x42,0xb0,0x42,
1463 0xac,0x43,0x63,0xff,0x36,0x42,0xdd,0x74,0xaf,0x43,0x1e,0xa6,0x45,0x42,0x44,0x82,0xb2,0x43,0x08,0x74,
1464 0x1b,0x4b,0x42,0x79,0x7a,0xb3,0x43,0x10,0x21,0x4f,0x42,0x2a,0x18,0xb5,0x43,0xdb,0x4c,0x54,0x42,0x91,
1465 0x19,0xb6,0x43,0x08,0xee,0x3f,0x65,0x42,0x5f,0x28,0xba,0x43,0xa7,0xaf,0x66,0x42,0xb9,0x50,0xb6,0x43,
1466 0x14,0x58,0x5c,0x42,0xca,0xdc,0xb1,0x43,0x08,0x2c,0x8b,0x4c,0x42,0x4e,0x30,0xac,0x43,0x19,0xcf,0x48,
1467 0x42,0x2a,0xd0,0xa8,0x43,0xbc,0xab,0x49,0x42,0xa9,0x4c,0xa6,0x43,0x08,0x61,0x5f,0x47,0x42,0xfa,0xa2,
1468 0xa2,0x43,0xa7,0xaf,0x66,0x42,0x85,0x98,0x94,0x43,0x2a,0xf4,0x2e,0x42,0xc3,0x62,0x95,0x43,0x07,0x2a,
1469 0xf4,0x2e,0x42,0x04,0x21,0x94,0x43,0x09,0x06,0xd0,0xfe,0xea,0x41,0x9f,0x0e,0x94,0x43,0x08,0xdc,0xe3,
1470 0xf1,0x41,0xe9,0x9e,0x92,0x43,0xd2,0xe7,0x0b,0x42,0xd6,0x06,0x95,0x43,0x2a,0xf4,0x2e,0x42,0x04,0x21,
1471 0x94,0x43,0x07,0x2a,0xf4,0x2e,0x42,0xc3,0x62,0x95,0x43,0x08,0x87,0x17,0x2e,0x42,0xc3,0x62,0x95,0x43,
1472 0xe7,0x3a,0x2d,0x42,0xf5,0x6b,0x95,0x43,0x44,0x5e,0x2c,0x42,0xf5,0x6b,0x95,0x43,0x08,0xd1,0x47,0x1c,
1473 0x42,0x19,0xc0,0x96,0x43,0x66,0xdf,0x05,0x42,0x38,0x19,0x95,0x43,0x12,0x6a,0x00,0x42,0xb2,0xbe,0x95,
1474 0x43,0x08,0xbb,0x6b,0xea,0x41,0xd6,0x12,0x97,0x43,0x2d,0x82,0xfa,0x41,0x61,0x74,0x9b,0x43,0x7e,0x72,
1475 0x06,0x42,0x8a,0xab,0x9b,0x43,0x08,0xc8,0x39,0x12,0x42,0x4e,0xd0,0x9b,0x43,0x53,0xe3,0x22,0x42,0xc3,
1476 0x86,0x9b,0x43,0x2a,0xf4,0x2e,0x42,0x57,0xa2,0x9b,0x43,0x07,0x2a,0xf4,0x2e,0x42,0x6a,0x52,0x9d,0x43,
1477 0x08,0x01,0xa5,0x2a,0x42,0xa4,0x2d,0x9d,0x43,0x96,0x9c,0x24,0x42,0x06,0x40,0x9d,0x43,0x8a,0xb7,0x1d,
1478 0x42,0x9a,0x5b,0x9d,0x43,0x08,0x6b,0x16,0x13,0x42,0xcd,0x64,0x9d,0x43,0x42,0xc7,0x0e,0x42,0x9a,0x5b,
1479 0x9d,0x43,0x23,0x26,0x04,0x42,0xcd,0x64,0x9d,0x43,0x08,0xe6,0x91,0xeb,0x41,0x38,0x49,0x9d,0x43,0x73,
1480 0x7b,0xdb,0x41,0xf5,0x83,0x99,0x43,0x7f,0x60,0xe2,0x41,0x0b,0x0b,0x98,0x43,0x08,0x7f,0x60,0xe2,0x41,
1481 0xec,0x99,0x95,0x43,0xe3,0x5a,0xde,0x41,0xbe,0x7f,0x96,0x43,0xd0,0xfe,0xea,0x41,0x9f,0x0e,0x94,0x43,
1482 0x07,0xd0,0xfe,0xea,0x41,0x9f,0x0e,0x94,0x43,0x09,0x06,0x2a,0xf4,0x2e,0x42,0x6d,0xad,0xb0,0x43,0x08,
1483 0xd4,0x7e,0x29,0x42,0xab,0x6b,0xaf,0x43,0x4e,0x0c,0x26,0x42,0x44,0x6a,0xae,0x43,0x38,0x79,0x25,0x42,
1484 0xd4,0x96,0xad,0x43,0x08,0x25,0xbd,0x21,0x42,0xe2,0x4b,0xac,0x43,0x49,0x35,0x29,0x42,0x9a,0x97,0xa7,
1485 0x43,0x2a,0xf4,0x2e,0x42,0x61,0xa4,0xa3,0x43,0x07,0x2a,0xf4,0x2e,0x42,0x6d,0xad,0xb0,0x43,0x09,0x06,
1486 0x1d,0xe5,0x7f,0x43,0x87,0x4a,0xe6,0x43,0x08,0x86,0x20,0x80,0x43,0x57,0x41,0xe6,0x43,0x7d,0x4e,0x80,
1487 0x43,0x25,0x38,0xe6,0x43,0xa5,0x85,0x80,0x43,0xf3,0x2e,0xe6,0x43,0x08,0x35,0xca,0x83,0x43,0xd4,0xc9,
1488 0xe5,0x43,0x9c,0xd7,0x86,0x43,0x44,0x91,0xe4,0x43,0xd5,0xca,0x8a,0x43,0x91,0x1c,0xe6,0x43,0x08,0x53,
1489 0x5f,0x8c,0x43,0xf8,0x1d,0xe7,0x43,0x2f,0x17,0x8d,0x43,0x4e,0x7b,0xe8,0x43,0x92,0x29,0x8d,0x43,0x2f,
1490 0x22,0xea,0x43,0x07,0x92,0x29,0x8d,0x43,0x44,0xb5,0xea,0x43,0x08,0xfe,0x0d,0x8d,0x43,0x2a,0x4b,0xed,
1491 0x43,0xe3,0x8b,0x8b,0x43,0x55,0x7d,0xf0,0x43,0xec,0x51,0x89,0x43,0x72,0x0b,0xf4,0x43,0x08,0xcd,0xd4,
1492 0x84,0x43,0x9d,0x55,0xfb,0x43,0xc9,0xe5,0x83,0x43,0x74,0x1e,0xfb,0x43,0x73,0x94,0x84,0x43,0x5a,0x90,
1493 0xf7,0x43,0x08,0xe8,0x62,0x88,0x43,0xfd,0x30,0xee,0x43,0x39,0xc5,0x86,0x43,0xdd,0xbf,0xeb,0x43,0x35,
1494 0xbe,0x81,0x43,0x40,0xde,0xed,0x43,0x08,0x4f,0x34,0x81,0x43,0x36,0x0c,0xee,0x43,0x08,0x98,0x80,0x43,
1495 0xfd,0x30,0xee,0x43,0x1d,0xe5,0x7f,0x43,0x91,0x4c,0xee,0x43,0x07,0x1d,0xe5,0x7f,0x43,0x91,0x40,0xec,
1496 0x43,0x08,0x35,0xbe,0x81,0x43,0x06,0xf7,0xeb,0x43,0x15,0x65,0x83,0x43,0x49,0xa4,0xeb,0x43,0x1e,0x43,
1497 0x85,0x43,0xbe,0x5a,0xeb,0x43,0x08,0xae,0x93,0x8a,0x43,0xfd,0x18,0xea,0x43,0x42,0x97,0x86,0x43,0x5f,
1498 0x67,0xf4,0x43,0xa9,0x98,0x87,0x43,0xd4,0x1d,0xf4,0x43,0x08,0x5c,0x25,0x8a,0x43,0xcf,0x16,0xef,0x43,
1499 0x46,0xaa,0x8d,0x43,0x5a,0x3c,0xe9,0x43,0x19,0x6c,0x88,0x43,0x53,0x5e,0xe7,0x43,0x08,0xc4,0x02,0x85,
1500 0x43,0x96,0x0b,0xe7,0x43,0x85,0x2c,0x82,0x43,0x83,0x67,0xe7,0x43,0x1d,0xe5,0x7f,0x43,0x72,0xc3,0xe7,
1501 0x43,0x07,0x1d,0xe5,0x7f,0x43,0x87,0x4a,0xe6,0x43,0x09,0x06,0xfd,0x24,0x6c,0x43,0xd9,0x94,0xe0,0x43,
1502 0x08,0xfa,0x6c,0x78,0x43,0xd1,0xc2,0xe0,0x43,0x25,0x5c,0x6c,0x43,0x25,0x44,0xe8,0x43,0x1d,0xe5,0x7f,
1503 0x43,0x87,0x4a,0xe6,0x43,0x07,0x1d,0xe5,0x7f,0x43,0x72,0xc3,0xe7,0x43,0x08,0xa6,0x27,0x7b,0x43,0x91,
1504 0x28,0xe8,0x43,0xbc,0xa2,0x77,0x43,0xb0,0x8d,0xe8,0x43,0xc6,0x68,0x75,0x43,0x57,0x4d,0xe8,0x43,0x08,
1505 0xe0,0xd2,0x72,0x43,0xab,0x9e,0xe7,0x43,0x50,0x9a,0x71,0x43,0x2a,0x27,0xe7,0x43,0xea,0x98,0x70,0x43,
1506 0x57,0x35,0xe4,0x43,0x08,0x94,0x3b,0x6f,0x43,0x14,0x7c,0xe2,0x43,0xff,0x13,0x6d,0x43,0x06,0xbb,0xe1,
1507 0x43,0xcf,0xfe,0x6a,0x43,0x06,0xbb,0xe1,0x43,0x08,0x44,0x9d,0x66,0x43,0x77,0x8e,0xe2,0x43,0x3b,0xef,
1508 0x6c,0x43,0x91,0x10,0xe4,0x43,0xfd,0x24,0x6c,0x43,0xb0,0x81,0xe6,0x43,0x08,0x96,0x23,0x6b,0x43,0xee,
1509 0x57,0xe9,0x43,0xca,0x0f,0x6a,0x43,0x5f,0x37,0xec,0x43,0x55,0x71,0x6e,0x43,0x9f,0x01,0xed,0x43,0x08,
1510 0xdb,0xfb,0x75,0x43,0x3b,0xef,0xec,0x43,0x09,0x3a,0x7b,0x43,0xb0,0xa5,0xec,0x43,0x1d,0xe5,0x7f,0x43,
1511 0x91,0x40,0xec,0x43,0x07,0x1d,0xe5,0x7f,0x43,0x91,0x4c,0xee,0x43,0x08,0xa9,0x16,0x7c,0x43,0xb0,0xb1,
1512 0xee,0x43,0x47,0xec,0x77,0x43,0xd9,0xe8,0xee,0x43,0x1e,0x9d,0x73,0x43,0xcf,0x16,0xef,0x43,0x08,0x0e,
1513 0xc9,0x6b,0x43,0xee,0x7b,0xef,0x43,0x7e,0x90,0x6a,0x43,0xfd,0x30,0xee,0x43,0x01,0xfc,0x68,0x43,0x4e,
1514 0x93,0xec,0x43,0x08,0x31,0xf9,0x66,0x43,0x4e,0x87,0xea,0x43,0x31,0x11,0x6b,0x43,0xd4,0xd5,0xe7,0x43,
1515 0xd9,0xc4,0x68,0x43,0xd4,0xc9,0xe5,0x43,0x08,0xe5,0x79,0x67,0x43,0x77,0x9a,0xe4,0x43,0x44,0x9d,0x66,
1516 0x43,0xab,0x86,0xe3,0x43,0x7e,0x78,0x66,0x43,0x0b,0xaa,0xe2,0x43,0x07,0x7e,0x78,0x66,0x43,0x57,0x29,
1517 0xe2,0x43,0x08,0xa7,0xaf,0x66,0x43,0xbe,0x1e,0xe1,0x43,0x87,0x56,0x68,0x43,0x77,0x82,0xe0,0x43,0xfd,
1518 0x24,0x6c,0x43,0xd9,0x94,0xe0,0x43,0x09,0x06,0xc4,0x41,0xbf,0x43,0x85,0xc0,0x72,0x42,0x08,0x73,0xdf,
1519 0xc0,0x43,0xf4,0x76,0x72,0x42,0x97,0x33,0xc2,0x43,0x85,0xc0,0x72,0x42,0xb2,0xb5,0xc3,0x43,0x64,0x56,
1520 0x75,0x42,0x08,0x03,0x24,0xc4,0x43,0x5e,0x7f,0x78,0x42,0xfa,0x51,0xc4,0x43,0x01,0x85,0x7c,0x42,0x5c,
1521 0x64,0xc4,0x43,0xa0,0xb3,0x80,0x42,0x07,0x5c,0x64,0xc4,0x43,0x10,0x93,0x83,0x42,0x08,0xc8,0x48,0xc4,
1522 0x43,0x1c,0x78,0x8a,0x42,0x27,0x6c,0xc3,0x43,0xaf,0xcf,0x94,0x42,0x23,0x7d,0xc2,0x43,0x99,0x9c,0xa4,
1523 0x42,0x08,0x3d,0xe7,0xbf,0x43,0xfb,0xfd,0xb5,0x42,0xb3,0x9d,0xbf,0x43,0x88,0x17,0xae,0x42,0xc4,0x41,
1524 0xbf,0x43,0x69,0x76,0xa3,0x42,0x07,0xc4,0x41,0xbf,0x43,0xac,0xc8,0x8f,0x42,0x08,0x4f,0x8b,0xbf,0x43,
1525 0xed,0x81,0x91,0x42,0xe4,0xa6,0xbf,0x43,0x5d,0x61,0x94,0x42,0xfa,0x39,0xc0,0x43,0x3b,0x49,0x9d,0x42,
1526 0x08,0x2b,0x43,0xc0,0x43,0x28,0xed,0xa9,0x42,0x61,0x3b,0xc1,0x43,0x00,0x9e,0xa5,0x42,0xe4,0xb2,0xc1,
1527 0x43,0x5d,0x91,0x9c,0x42,0x08,0x78,0xce,0xc1,0x43,0xfd,0x36,0x90,0x42,0x22,0x89,0xc4,0x43,0x81,0x72,
1528 0x86,0x42,0xae,0xc6,0xc2,0x43,0xa0,0xb3,0x80,0x42,0x08,0x54,0x86,0xc2,0x43,0x58,0xd1,0x7e,0x42,0x30,
1529 0x32,0xc1,0x43,0xce,0x5e,0x7b,0x42,0xc4,0x41,0xbf,0x43,0xe8,0xf1,0x7b,0x42,0x07,0xc4,0x41,0xbf,0x43,
1530 0x85,0xc0,0x72,0x42,0x09,0x06,0xf6,0x32,0xbb,0x43,0x40,0xa7,0x60,0x42,0x08,0x35,0xfd,0xbb,0x43,0xa4,
1531 0xa1,0x5c,0x42,0x5e,0x34,0xbc,0x43,0x9d,0x2a,0x70,0x42,0x5e,0x40,0xbe,0x43,0x0e,0x0a,0x73,0x42,0x08,
1532 0x4c,0x9c,0xbe,0x43,0x0e,0x0a,0x73,0x42,0x08,0xef,0xbe,0x43,0x0e,0x0a,0x73,0x42,0xc4,0x41,0xbf,0x43,
1533 0x85,0xc0,0x72,0x42,0x07,0xc4,0x41,0xbf,0x43,0xe8,0xf1,0x7b,0x42,0x08,0xcd,0x13,0xbf,0x43,0xe8,0xf1,
1534 0x7b,0x42,0xd6,0xe5,0xbe,0x43,0x71,0x3b,0x7c,0x42,0xdf,0xb7,0xbe,0x43,0x71,0x3b,0x7c,0x42,0x08,0x08,
1535 0xe3,0xbc,0x43,0xa4,0x61,0x7d,0x42,0x28,0x3c,0xbb,0x43,0x91,0x45,0x69,0x42,0x28,0x3c,0xbb,0x43,0x58,
1536 0x71,0x6e,0x42,0x08,0xce,0xfb,0xba,0x43,0xd5,0x35,0x78,0x42,0x59,0x45,0xbb,0x43,0x58,0x23,0x82,0x42,
1537 0xa1,0xe1,0xbb,0x43,0xd7,0xbe,0x88,0x42,0x08,0xc9,0x18,0xbc,0x43,0xaf,0x9f,0x8c,0x42,0x1e,0x76,0xbd,
1538 0x43,0x51,0x7c,0x8d,0x42,0xd6,0xe5,0xbe,0x43,0xf4,0x58,0x8e,0x42,0x08,0x9c,0x0a,0xbf,0x43,0x45,0xc7,
1539 0x8e,0x42,0x30,0x26,0xbf,0x43,0x96,0x35,0x8f,0x42,0xc4,0x41,0xbf,0x43,0xac,0xc8,0x8f,0x42,0x07,0xc4,
1540 0x41,0xbf,0x43,0x69,0x76,0xa3,0x42,0x08,0x08,0xef,0xbe,0x43,0xb1,0xd6,0x99,0x42,0xe8,0x89,0xbe,0x43,
1541 0xde,0xc5,0x8d,0x42,0xc0,0x46,0xbc,0x43,0xc2,0x5b,0x90,0x42,0x08,0x9c,0xf2,0xba,0x43,0x86,0x80,0x90,
1542 0x42,0xf2,0x43,0xba,0x43,0xe8,0x73,0x87,0x42,0x8f,0x31,0xba,0x43,0xb6,0xf4,0x7d,0x42,0x07,0x8f,0x31,
1543 0xba,0x43,0x21,0xc6,0x76,0x42,0x08,0xc0,0x3a,0xba,0x43,0x5f,0x48,0x6b,0x42,0xae,0x96,0xba,0x43,0xe3,
1544 0x83,0x61,0x42,0xf6,0x32,0xbb,0x43,0x40,0xa7,0x60,0x42,0x09,0x06,0xea,0x74,0xea,0x43,0x61,0x44,0x93,
1545 0x43,0x08,0x24,0x5c,0xec,0x43,0x31,0x3b,0x93,0x43,0xfb,0x30,0xee,0x43,0x93,0x4d,0x93,0x43,0x0d,0xe1,
1546 0xef,0x43,0x80,0xa9,0x93,0x43,0x08,0x8f,0x58,0xf0,0x43,0xd1,0x17,0x94,0x43,0xb7,0x8f,0xf0,0x43,0x10,
1547 0xe2,0x94,0x43,0xea,0x98,0xf0,0x43,0xa9,0xec,0x95,0x43,0x07,0xea,0x98,0xf0,0x43,0x38,0x25,0x97,0x43,
1548 0x08,0x23,0x74,0xf0,0x43,0x9f,0x32,0x9a,0x43,0x5a,0x60,0xef,0x43,0x53,0xcb,0x9e,0x43,0x2d,0x3a,0xee,
1549 0x43,0xfd,0x91,0xa3,0x43,0x08,0xa2,0xf0,0xed,0x43,0xdd,0x38,0xa5,0x43,0x17,0xa7,0xed,0x43,0xbe,0xdf,
1550 0xa6,0x43,0x5a,0x54,0xed,0x43,0x9f,0x86,0xa8,0x43,0x08,0xfc,0x24,0xec,0x43,0xca,0xc4,0xad,0x43,0x48,
1551 0xa4,0xeb,0x43,0x40,0x6f,0xab,0x43,0x28,0x3f,0xeb,0x43,0x1c,0x0f,0xa8,0x43,0x08,0x1f,0x6d,0xeb,0x43,
1552 0x72,0x48,0xa3,0x43,0x67,0x09,0xec,0x43,0xd1,0x53,0x9e,0x43,0xea,0x74,0xea,0x43,0x1e,0xc7,0x9b,0x43,
1553 0x07,0xea,0x74,0xea,0x43,0x8a,0x9f,0x99,0x43,0x08,0x7e,0x90,0xea,0x43,0x8a,0x9f,0x99,0x43,0x12,0xac,
1554 0xea,0x43,0xbc,0xa8,0x99,0x43,0xa7,0xc7,0xea,0x43,0xbc,0xa8,0x99,0x43,0x08,0x51,0x76,0xeb,0x43,0x9f,
1555 0x32,0x9a,0x43,0x5e,0x37,0xec,0x43,0x49,0xed,0x9c,0x43,0xb0,0xa5,0xec,0x43,0x2a,0xa0,0xa0,0x43,0x08,
1556 0x09,0xe6,0xec,0x43,0xd1,0x77,0xa4,0x43,0x28,0x4b,0xed,0x43,0x61,0xa4,0xa3,0x43,0xab,0xc2,0xed,0x43,
1557 0x8e,0xb2,0xa0,0x43,0x08,0x70,0xe7,0xed,0x43,0xde,0x08,0x9d,0x43,0x87,0x86,0xf0,0x43,0x2f,0x53,0x97,
1558 0x43,0x87,0x7a,0xee,0x43,0xec,0x99,0x95,0x43,0x08,0xca,0x27,0xee,0x43,0xff,0x3d,0x95,0x43,0x74,0xca,
1559 0xec,0x43,0x55,0x8f,0x94,0x43,0xea,0x74,0xea,0x43,0xe7,0xaa,0x94,0x43,0x07,0xea,0x74,0xea,0x43,0x61,
1560 0x44,0x93,0x43,0x09,0x06,0x05,0xd3,0xe5,0x43,0x19,0x9c,0x90,0x43,0x08,0x09,0xc2,0xe6,0x43,0xd1,0xff,
1561 0x8f,0x43,0x4d,0x6f,0xe6,0x43,0x74,0xe8,0x92,0x43,0x3b,0xd7,0xe8,0x43,0xc3,0x56,0x93,0x43,0x08,0x1f,
1562 0x61,0xe9,0x43,0x93,0x4d,0x93,0x43,0x05,0xeb,0xe9,0x43,0x93,0x4d,0x93,0x43,0xea,0x74,0xea,0x43,0x61,
1563 0x44,0x93,0x43,0x07,0xea,0x74,0xea,0x43,0xe7,0xaa,0x94,0x43,0x08,0x24,0x50,0xea,0x43,0xe7,0xaa,0x94,
1564 0x43,0x2d,0x22,0xea,0x43,0xe7,0xaa,0x94,0x43,0x36,0xf4,0xe9,0x43,0xe7,0xaa,0x94,0x43,0x08,0xa2,0xcc,
1565 0xe7,0x43,0xe0,0xd8,0x94,0x43,0xd4,0xc9,0xe5,0x43,0x19,0xa8,0x92,0x43,0xd4,0xc9,0xe5,0x43,0x27,0x69,
1566 0x93,0x43,0x08,0x17,0x77,0xe5,0x43,0xe0,0xd8,0x94,0x43,0x67,0xe5,0xe5,0x43,0x47,0xda,0x95,0x43,0x43,
1567 0x9d,0xe6,0x43,0xe2,0xd3,0x97,0x43,0x08,0x9d,0xdd,0xe6,0x43,0xad,0xe7,0x98,0x43,0x09,0xce,0xe8,0x43,
1568 0xff,0x55,0x99,0x43,0xea,0x74,0xea,0x43,0x8a,0x9f,0x99,0x43,0x07,0xea,0x74,0xea,0x43,0x1e,0xc7,0x9b,
1569 0x43,0x08,0x71,0xcf,0xe9,0x43,0x53,0xb3,0x9a,0x43,0xa7,0xbb,0xe8,0x43,0xdb,0x0d,0x9a,0x43,0xc6,0x14,
1570 0xe7,0x43,0xdb,0x0d,0x9a,0x43,0x08,0x48,0x80,0xe5,0x43,0xdb,0x0d,0x9a,0x43,0x0a,0xb6,0xe4,0x43,0xc3,
1571 0x6e,0x97,0x43,0x76,0x9a,0xe4,0x43,0x74,0xf4,0x94,0x43,0x07,0x76,0x9a,0xe4,0x43,0x79,0xd7,0x93,0x43,
1572 0x08,0xd8,0xac,0xe4,0x43,0x66,0x27,0x92,0x43,0x29,0x1b,0xe5,0x43,0xe0,0xc0,0x90,0x43,0x05,0xd3,0xe5,
1573 0x43,0x19,0x9c,0x90,0x43,0x09,0x06,0x1b,0x66,0xe6,0x42,0xe3,0xa3,0x8f,0x42,0x08,0x71,0x0b,0xf4,0x42,
1574 0x00,0x0e,0x8d,0x42,0x8c,0x0f,0x01,0x43,0x3e,0xc0,0x89,0x42,0xf3,0x28,0x06,0x43,0x48,0x9e,0x8b,0x42,
1575 0x08,0x15,0x89,0x09,0x43,0x00,0x0e,0x8d,0x42,0xe0,0x9c,0x0a,0x43,0xc1,0x8b,0x98,0x42,0xa6,0xc1,0x0a,
1576 0x43,0x02,0xa5,0xaa,0x42,0x07,0xa6,0xc1,0x0a,0x43,0xf9,0xf6,0xb0,0x42,0x08,0xa6,0xc1,0x0a,0x43,0x47,
1577 0x8e,0xb4,0x42,0x42,0xaf,0x0a,0x43,0x1f,0x6f,0xb8,0x42,0xe0,0x9c,0x0a,0x43,0xba,0x74,0xbc,0x42,0x08,
1578 0xa1,0xd2,0x09,0x43,0x40,0x47,0xd0,0x42,0x0d,0xab,0x07,0x43,0x91,0xb5,0xd0,0x42,0x3b,0xb9,0x04,0x43,
1579 0xec,0x71,0xba,0x42,0x08,0xe5,0x5b,0x03,0x43,0xe3,0x33,0xa8,0x42,0x63,0xd8,0x00,0x43,0xce,0x70,0x9f,
1580 0x42,0x1b,0x66,0xe6,0x42,0xae,0x2f,0xa5,0x42,0x07,0x1b,0x66,0xe6,0x42,0xa2,0x4a,0x9e,0x42,0x08,0xed,
1581 0x6f,0xed,0x42,0x73,0x24,0x9d,0x42,0xd8,0x0c,0xf5,0x42,0x99,0x6c,0x9c,0x42,0x27,0xab,0xfd,0x42,0xea,
1582 0xda,0x9c,0x42,0x08,0x36,0xca,0x03,0x43,0x2b,0x94,0x9e,0x42,0x68,0xc7,0x01,0x43,0x8f,0xbe,0xa2,0x42,
1583 0xfa,0x06,0x08,0x43,0x73,0xb4,0xb5,0x42,0x08,0x8e,0x2e,0x0a,0x43,0x1f,0x6f,0xb8,0x42,0x9d,0xe3,0x08,
1584 0x43,0xd7,0x1e,0x99,0x42,0x28,0x15,0x05,0x43,0x32,0x3b,0x93,0x42,0x08,0x63,0xf0,0x04,0x43,0x70,0xed,
1585 0x8f,0x42,0x71,0x0b,0xf4,0x42,0x32,0x3b,0x93,0x42,0x1b,0x66,0xe6,0x42,0x73,0xf4,0x94,0x42,0x07,0x1b,
1586 0x66,0xe6,0x42,0xe3,0xa3,0x8f,0x42,0x09,0x06,0x5e,0x28,0xba,0x42,0x35,0xe2,0x87,0x42,0x08,0x8e,0x55,
1587 0xc0,0x42,0xb8,0x4d,0x86,0x42,0x60,0xbf,0xd7,0x42,0x3e,0xf0,0x91,0x42,0x63,0xf6,0xe4,0x42,0x70,0xed,
1588 0x8f,0x42,0x08,0x7a,0x89,0xe5,0x42,0xac,0xc8,0x8f,0x42,0xcc,0xf7,0xe5,0x42,0xac,0xc8,0x8f,0x42,0x1b,
1589 0x66,0xe6,0x42,0xe3,0xa3,0x8f,0x42,0x07,0x1b,0x66,0xe6,0x42,0x73,0xf4,0x94,0x42,0x08,0x63,0xf6,0xe4,
1590 0x42,0x3b,0x19,0x95,0x42,0xe6,0x61,0xe3,0x42,0x00,0x3e,0x95,0x42,0xf4,0x16,0xe2,0x42,0xc4,0x62,0x95,
1591 0x42,0x08,0x6e,0x74,0xd6,0x42,0x15,0xd1,0x95,0x42,0x97,0x63,0xca,0x42,0xaf,0xcf,0x94,0x42,0xfb,0x2d,
1592 0xbe,0x42,0x86,0x80,0x90,0x42,0x08,0x97,0x03,0xba,0x42,0xce,0x10,0x8f,0x42,0x5e,0x28,0xba,0x42,0x3e,
1593 0xf0,0x91,0x42,0xf2,0x4f,0xbc,0x42,0x45,0xf7,0x96,0x42,0x08,0x27,0x54,0xbf,0x42,0x73,0x24,0x9d,0x42,
1594 0xa5,0xe8,0xc0,0x42,0x86,0xe0,0xa0,0x42,0xe4,0xca,0xc5,0x42,0xed,0x11,0xaa,0x42,0x08,0x54,0xaa,0xc8,
1595 0x42,0x86,0x40,0xb1,0x42,0x59,0x81,0xc5,0x42,0xa1,0x11,0xc4,0x42,0x3e,0xe7,0xbf,0x42,0xfb,0x8d,0xce,
1596 0x42,0x08,0xb4,0x6d,0xb7,0x42,0x30,0xc2,0xd9,0x42,0x46,0xf5,0xc9,0x42,0xdf,0x53,0xd9,0x42,0x38,0x40,
1597 0xcb,0x42,0x62,0x8f,0xcf,0x42,0x08,0x7d,0xf9,0xcc,0x42,0xec,0xa1,0xc2,0x42,0x07,0x43,0xcd,0x42,0x6c,
1598 0xdd,0xb8,0x42,0x2b,0x8b,0xcc,0x42,0x92,0xf5,0xaf,0x42,0x08,0xf9,0x8d,0xce,0x42,0x41,0x57,0xa7,0x42,
1599 0x5b,0xb8,0xd2,0x42,0xae,0x2f,0xa5,0x42,0x18,0x2f,0xd9,0x42,0x13,0x2a,0xa1,0x42,0x08,0x41,0x7e,0xdd,
1600 0x42,0xe3,0x03,0xa0,0x42,0x2e,0xf2,0xe1,0x42,0x7c,0x02,0x9f,0x42,0x1b,0x66,0xe6,0x42,0xa2,0x4a,0x9e,
1601 0x42,0x07,0x1b,0x66,0xe6,0x42,0xae,0x2f,0xa5,0x42,0x08,0x4d,0x63,0xe4,0x42,0x00,0x9e,0xa5,0x42,0xf4,
1602 0x16,0xe2,0x42,0x15,0x31,0xa6,0x42,0x99,0xca,0xdf,0x42,0x2b,0xc4,0xa6,0x42,0x08,0xc0,0x82,0xc6,0x42,
1603 0xc4,0xc2,0xa5,0x42,0x57,0xe1,0xd5,0x42,0x91,0xb5,0xd0,0x42,0x54,0xda,0xd0,0x42,0x97,0x93,0xd2,0x42,
1604 0x08,0x9c,0x3a,0xc7,0x42,0x17,0x58,0xdc,0x42,0x9c,0x0a,0xbf,0x42,0x6e,0xa4,0xde,0x42,0x90,0x25,0xb8,
1605 0x42,0xdf,0x53,0xd9,0x42,0x08,0x59,0x21,0xb5,0x42,0xf2,0xdf,0xd4,0x42,0x51,0x43,0xb3,0x42,0x91,0xb5,
1606 0xd0,0x42,0xc5,0x29,0xbb,0x42,0x0e,0x1a,0xca,0x42,0x08,0x65,0x36,0xc4,0x42,0xd0,0x07,0xbd,0x42,0x3e,
1607 0xe7,0xbf,0x42,0x37,0x09,0xbe,0x42,0x0c,0xea,0xc1,0x42,0xcd,0xd0,0xaf,0x42,0x08,0x2b,0x5b,0xc4,0x42,
1608 0x18,0x08,0xa3,0x42,0x67,0xa6,0xab,0x42,0x99,0x3c,0x94,0x42,0x5e,0x28,0xba,0x42,0x35,0xe2,0x87,0x42,
1609 0x09,];