9fans.net/go@v0.0.5/draw/memdraw/drawtest.go (about) 1 // +build ignore 2 3 package main 4 5 /* 6 * This program tests the 'memimagedraw' primitive stochastically. 7 * It tests the combination aspects of it thoroughly, but since the 8 * three images it uses are disjoint, it makes no check of the 9 * correct behavior when images overlap. That is, however, much 10 * easier to get right and to test. 11 */ 12 13 import ( 14 "bufio" 15 "bytes" 16 "flag" 17 "fmt" 18 "io" 19 "log" 20 "math/rand" 21 "os" 22 "path/filepath" 23 "time" 24 25 "9fans.net/go/draw" 26 "9fans.net/go/draw/memdraw" 27 ) 28 29 const DBG = 0 30 31 func RGB2K(r, g, b uint8) uint8 { 32 // fmt.Printf("RGB2K %#x %#x %#x -> %#x\n%s", r, g, b, uint8((299*int(r)+587*int(g)+114*int(b))/1000), string(debug.Stack())) 33 return uint8((299*int(r) + 587*int(g) + 114*int(b)) / 1000) 34 } 35 36 var dchan string 37 var schan string 38 var mchan string 39 40 var drawdebug int = 0 41 var seed int64 42 var niters int = 100 43 var dbpp int /* bits per pixel in destination */ 44 var sbpp int /* bits per pixel in src */ 45 var mbpp int /* bits per pixel in mask */ 46 var dpm uint8 /* pixel mask at high part of byte, in destination */ 47 var nbytes int /* in destination */ 48 49 var Xrange int = 64 50 var Yrange int = 16 51 52 var dst *memdraw.Image 53 var src *memdraw.Image 54 var mask *memdraw.Image 55 var stmp *memdraw.Image 56 var mtmp *memdraw.Image 57 var ones *memdraw.Image 58 var dstbits []uint8 59 var srcbits []uint8 60 var maskbits []uint8 61 var savedstbits []uint8 62 63 func rdb() { 64 } 65 66 func iprint(format string, args ...interface{}) { 67 fmt.Fprintf(os.Stderr, format, args...) 68 } 69 70 func main() { 71 memdraw.Init() 72 seed = time.Now().UnixNano() 73 74 flag.IntVar(&Xrange, "x", Xrange, "") 75 flag.IntVar(&Yrange, "y", Yrange, "") 76 flag.IntVar(&niters, "n", niters, "") 77 flag.Int64Var(&seed, "s", seed, "") 78 flag.Usage = func() { 79 fmt.Fprintf(os.Stderr, "usage: dtest [dchan [schan [mchan]]]\n") 80 os.Exit(2) 81 } 82 flag.Parse() 83 84 dchan = "r8g8b8" 85 schan = "r8g8b8" 86 mchan = "r8g8b8" 87 switch flag.NArg() { 88 default: 89 flag.Usage() 90 case 3: 91 mchan = flag.Arg(2) 92 fallthrough 93 case 2: 94 schan = flag.Arg(1) 95 fallthrough 96 case 1: 97 dchan = flag.Arg(0) 98 fallthrough 99 case 0: 100 // ok 101 } 102 103 fmt.Fprintf(os.Stderr, "%s -x %d -y %d -s 0x%x %s %s %s\n", filepath.Base(os.Args[0]), Xrange, Yrange, seed, dchan, schan, mchan) 104 rand.Seed(seed) 105 106 alloc := func(s string) *memdraw.Image { 107 pix, err := draw.ParsePix(s) 108 if err != nil { 109 log.Fatal(err) 110 } 111 i, err := memdraw.AllocImage(draw.Rect(0, 0, Xrange, Yrange), pix) 112 if err != nil { 113 log.Fatal(err) 114 } 115 return i 116 } 117 118 dst = alloc(dchan) 119 src = alloc(schan) 120 mask = alloc(mchan) 121 stmp = alloc(schan) 122 mtmp = alloc(mchan) 123 ones = alloc(mchan) 124 125 nbytes = (4*Xrange+4)*Yrange + 4 126 srcbits = make([]byte, nbytes) 127 dstbits = make([]byte, nbytes) 128 maskbits = make([]byte, nbytes) 129 savedstbits = make([]byte, nbytes) 130 131 dbpp = dst.Depth 132 sbpp = src.Depth 133 mbpp = mask.Depth 134 dpm = uint8(0xFF) ^ (0xFF >> dbpp) 135 b := ones.Data.Bdata[:int(ones.Width)*4*Yrange] 136 for i := range b { 137 b[i] = 0xFF 138 } 139 140 fmt.Fprintf(os.Stderr, "dtest: verify single pixel operation\n") 141 verifyone() 142 143 fmt.Fprintf(os.Stderr, "dtest: verify full line non-replicated\n") 144 verifyline() 145 146 fmt.Fprintf(os.Stderr, "dtest: verify full rectangle non-replicated\n") 147 verifyrect() 148 149 fmt.Fprintf(os.Stderr, "dtest: verify full rectangle source replicated\n") 150 verifyrectrepl(1, 0) 151 152 fmt.Fprintf(os.Stderr, "dtest: verify full rectangle mask replicated\n") 153 verifyrectrepl(0, 1) 154 155 fmt.Fprintf(os.Stderr, "dtest: verify full rectangle source and mask replicated\n") 156 verifyrectrepl(1, 1) 157 } 158 159 /* 160 * Dump out an ASCII representation of an image. The label specifies 161 * a list of characters to put at various points in the picture. 162 */ 163 func Bprintr5g6b5(bio io.Writer, _ string, v uint32) { 164 r := (v >> 11) & 31 165 g := (v >> 5) & 63 166 b := v & 31 167 fmt.Fprintf(bio, "%.2x%.2x%.2x", r, g, b) 168 } 169 170 func Bprintr5g5b5a1(bio io.Writer, _ string, v uint32) { 171 r := (v >> 11) & 31 172 g := (v >> 6) & 31 173 b := (v >> 1) & 31 174 a := v & 1 175 fmt.Fprintf(bio, "%.2x%.2x%.2x%.2x", r, g, b, a) 176 } 177 178 func Bprint(bio io.Writer, format string, arg uint32) { 179 fmt.Fprintf(bio, format, arg) 180 } 181 182 func dumpimage(name string, img *memdraw.Image, vdata []byte, labelpt draw.Point) { 183 var fmt_ func(io.Writer, string, uint32) 184 var format string 185 switch img.Depth { 186 case 1, 2, 4: 187 fmt_ = Bprint 188 format = "%.1x" 189 case 8: 190 fmt_ = Bprint 191 format = "%.2x" 192 case 16: 193 if img.Pix == draw.RGB16 { 194 fmt_ = Bprintr5g6b5 195 } else { 196 fmt_ = Bprint 197 format = "%.4x" 198 } 199 case 24: 200 fmt_ = Bprint 201 format = "%.6x" 202 case 32: 203 fmt_ = Bprint 204 format = "%.8x" 205 } 206 if fmt_ == nil { 207 panic("bad format") 208 } 209 210 r := img.R 211 b := bufio.NewWriter(os.Stderr) 212 data := vdata 213 bpp := img.Depth 214 repl := 0 215 if img.Flags&memdraw.Frepl != 0 { 216 repl = 1 217 } 218 fmt.Fprintf(b, "%s\t%d\tr %v clipr %v repl %d data %p *%v\n", name, r.Min.X, r, img.Clipr, repl, vdata, labelpt) 219 mask := (uint32(1) << bpp) - 1 220 /* for(y=r.Min.Y; y<r.Max.Y; y++){ */ 221 for y := 0; y < Yrange; y++ { 222 nb := 0 223 v := uint32(0) 224 p := data[(-len(img.BytesAt(draw.Pt(0, y))) + len(img.Data.Bdata)):] 225 fmt.Fprintf(b, "%-4d\t", y) 226 /* for(x=r.Min.X; x<r.Max.X; x++){ */ 227 for x := 0; x < Xrange; x++ { 228 if x == 0 { 229 fmt.Fprintf(b, "\t") 230 } 231 232 if x != 0 && (x%8) == 0 { 233 fmt.Fprintf(b, " ") 234 } 235 236 npr := 0 237 if x == labelpt.X && y == labelpt.Y { 238 fmt.Fprintf(b, "*") 239 npr++ 240 } 241 if npr == 0 { 242 fmt.Fprintf(b, " ") 243 } 244 245 for nb < bpp { 246 v &= (1 << nb) - 1 247 v |= uint32(p[0]) << nb 248 p = p[1:] 249 nb += 8 250 } 251 nb -= bpp 252 /* fmt.Fprintf(os.Stderr, "bpp %d v %.8x mask %.8x nb %d\n", bpp, v, mask, nb); */ 253 fmt_(b, format, (v>>nb)&mask) 254 } 255 fmt.Fprintf(b, "\n") 256 } 257 b.Flush() 258 } 259 260 /* 261 * Verify that the destination pixel has the specified value. 262 * The value is in the high bits of v, suitably masked, but must 263 * be extracted from the destination memdraw.Image. 264 */ 265 func checkone(p draw.Point, sp draw.Point, mp draw.Point) { 266 delta := -len(dst.BytesAt(p)) - -len(dst.Data.Bdata) 267 dp := dst.Data.Bdata[delta:] 268 sdp := savedstbits[delta:] 269 w := (dst.Depth + 7) / 8 270 271 if !bytes.Equal(dp[:w], sdp[:w]) { 272 fmt.Fprintf(os.Stderr, "dtest: one bad pixel drawing at dst %v from source %v mask %v\n", p, sp, mp) 273 fmt.Fprintf(os.Stderr, " %x should be %x\n", dp[:w], sdp[:w]) 274 fmt.Fprintf(os.Stderr, "addresses dst %p src %p mask %p\n", dp, src.BytesAt(sp), mask.BytesAt(mp)) 275 dumpimage("src", src, src.Data.Bdata, sp) 276 dumpimage("mask", mask, mask.Data.Bdata, mp) 277 dumpimage("origdst", dst, dstbits, p) 278 dumpimage("dst", dst, dst.Data.Bdata, p) 279 dumpimage("gooddst", dst, savedstbits, p) 280 panic("fail") 281 } 282 } 283 284 /* 285 * Verify that the destination line has the same value as the saved line. 286 */ 287 // #define RECTPTS(r) (r).Min.X, (r).Min.Y, (r).Max.X, (r).Max.Y 288 func checkline(r draw.Rectangle, sp draw.Point, mp draw.Point, y int, stmp *memdraw.Image, mtmp *memdraw.Image) { 289 dp := dst.BytesAt(draw.Pt(0, y)) 290 saved := savedstbits[y*int(dst.Width)*4:] 291 var nb int 292 if dst.Depth < 8 { 293 nb = Xrange / (8 / dst.Depth) 294 } else { 295 nb = Xrange * (dst.Depth / 8) 296 } 297 if !bytes.Equal(dp[:nb], saved[:nb]) { 298 fmt.Fprintf(os.Stderr, "dtest: bad line at y=%d; saved %p dp %p\n", y, saved, dp) 299 fmt.Fprintf(os.Stderr, "draw dst %v src %v mask %v\n", r, sp, mp) 300 dumpimage("src", src, src.Data.Bdata, sp) 301 if stmp != nil { 302 dumpimage("stmp", stmp, stmp.Data.Bdata, sp) 303 } 304 dumpimage("mask", mask, mask.Data.Bdata, mp) 305 if mtmp != nil { 306 dumpimage("mtmp", mtmp, mtmp.Data.Bdata, mp) 307 } 308 dumpimage("origdst", dst, dstbits, r.Min) 309 dumpimage("dst", dst, dst.Data.Bdata, r.Min) 310 dumpimage("gooddst", dst, savedstbits, r.Min) 311 panic("fail") 312 } 313 } 314 315 /* 316 * Fill the bits of an image with random data. 317 * The memdraw.Image parameter is used only to make sure 318 * the data is well formatted: only ucbits is written. 319 */ 320 func fill(img *memdraw.Image, ucbits []uint8) { 321 if img.Flags&memdraw.Falpha == 0 { 322 up := ucbits 323 var i int 324 for i = 0; i < nbytes/2; i++ { 325 up[0] = byte(rand.Int() >> 7) 326 up = up[1:] 327 } 328 if i+i != nbytes { 329 up[0] = byte(rand.Int() >> 7) 330 } 331 } else { 332 data := img.Data.Bdata 333 img.Data.Bdata = ucbits 334 335 for x := img.R.Min.X; x < img.R.Max.X; x++ { 336 for y := img.R.Min.Y; y < img.R.Max.Y; y++ { 337 alpha := rand.Int() >> 4 338 r := uint8(rand.Int() % (alpha + 1)) 339 g := uint8(rand.Int() % (alpha + 1)) 340 b := uint8(rand.Int() % (alpha + 1)) 341 putpixel(img, draw.Pt(x, y), rgbatopix(r, g, b, uint8(alpha))) 342 } 343 } 344 img.Data.Bdata = data 345 } 346 347 } 348 349 func memmove(x, y []byte, n int) { 350 copy(x[:n], y[:n]) 351 } 352 func memset(x []byte, v byte, n int) { 353 x = x[:n] 354 for i := range x { 355 x[i] = v 356 } 357 } 358 359 func assert(b bool) { 360 if !b { 361 panic("assert") 362 } 363 } 364 365 /* 366 * Mask is preset; do the rest 367 */ 368 func verifyonemask() { 369 fill(dst, dstbits) 370 fill(src, srcbits) 371 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 372 memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange) 373 memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange) 374 var dp draw.Point 375 376 dp.X = rand.Intn(Xrange) 377 dp.Y = rand.Intn(Yrange) 378 var sp draw.Point 379 380 sp.X = rand.Intn(Xrange) 381 sp.Y = rand.Intn(Yrange) 382 var mp draw.Point 383 384 mp.X = rand.Intn(Xrange) 385 mp.Y = rand.Intn(Yrange) 386 387 drawonepixel(dst, dp, src, sp, mask, mp) 388 memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange) 389 memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange) 390 391 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 392 dst.Draw(draw.Rect(dp.X, dp.Y, dp.X+1, dp.Y+1), src, sp, mask, mp, draw.SoverD) 393 memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange) 394 395 checkone(dp, sp, mp) 396 } 397 398 func verifyone() { 399 /* mask all zeros */ 400 memset(maskbits, 0, nbytes) 401 var i int 402 for i = 0; i < niters; i++ { 403 verifyonemask() 404 } 405 406 /* mask all ones */ 407 memset(maskbits, 0xFF, nbytes) 408 for i = 0; i < niters; i++ { 409 verifyonemask() 410 } 411 412 /* random mask */ 413 for i = 0; i < niters; i++ { 414 fill(mask, maskbits) 415 verifyonemask() 416 } 417 } 418 419 /* 420 * Mask is preset; do the rest 421 */ 422 func verifylinemask() { 423 if Xrange <= 1 || Yrange <= 1 { 424 return 425 } 426 fill(dst, dstbits) 427 fill(src, srcbits) 428 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 429 memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange) 430 memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange) 431 var dr draw.Rectangle 432 433 dr.Min.X = rand.Intn(Xrange - 1) 434 dr.Min.Y = rand.Intn(Yrange - 1) 435 dr.Max.X = dr.Min.X + 1 + rand.Intn(Xrange-1-dr.Min.X) 436 dr.Max.Y = dr.Min.Y + 1 437 var sp draw.Point 438 439 sp.X = rand.Intn(Xrange) 440 sp.Y = rand.Intn(Yrange) 441 var mp draw.Point 442 443 mp.X = rand.Intn(Xrange) 444 mp.Y = rand.Intn(Yrange) 445 446 tp := sp 447 up := mp 448 for x := dr.Min.X; x < dr.Max.X && tp.X < Xrange && up.X < Xrange; func() { x++; tp.X++; up.X++ }() { 449 dst.Draw(draw.Rect(x, dr.Min.Y, x+1, dr.Min.Y+1), src, tp, mask, up, draw.SoverD) 450 } 451 memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange) 452 453 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 454 455 dst.Draw(dr, src, sp, mask, mp, draw.SoverD) 456 checkline(dr, draw.Repl(src.R, sp), draw.Repl(mask.R, mp), dr.Min.Y, nil, nil) 457 } 458 459 func verifyline() { 460 /* mask all ones */ 461 memset(maskbits, 0xFF, nbytes) 462 var i int 463 for i = 0; i < niters; i++ { 464 verifylinemask() 465 } 466 467 /* mask all zeros */ 468 memset(maskbits, 0, nbytes) 469 for i = 0; i < niters; i++ { 470 verifylinemask() 471 } 472 473 /* random mask */ 474 for i = 0; i < niters; i++ { 475 fill(mask, maskbits) 476 verifylinemask() 477 } 478 } 479 480 /* 481 * Mask is preset; do the rest 482 */ 483 func verifyrectmask() { 484 if Xrange <= 1 || Yrange <= 1 { 485 return 486 } 487 fill(dst, dstbits) 488 fill(src, srcbits) 489 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 490 memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange) 491 memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange) 492 var dr draw.Rectangle 493 494 dr.Min.X = rand.Intn(Xrange - 1) 495 dr.Min.Y = rand.Intn(Yrange - 1) 496 dr.Max.X = dr.Min.X + 1 + rand.Intn(Xrange-1-dr.Min.X) 497 dr.Max.Y = dr.Min.Y + 1 + rand.Intn(Yrange-1-dr.Min.Y) 498 var sp draw.Point 499 500 sp.X = rand.Intn(Xrange) 501 sp.Y = rand.Intn(Yrange) 502 var mp draw.Point 503 504 mp.X = rand.Intn(Xrange) 505 mp.Y = rand.Intn(Yrange) 506 507 tp := sp 508 up := mp 509 var y int 510 for y = dr.Min.Y; y < dr.Max.Y && tp.Y < Yrange && up.Y < Yrange; func() { y++; tp.Y++; up.Y++ }() { 511 for x := dr.Min.X; x < dr.Max.X && tp.X < Xrange && up.X < Xrange; func() { x++; tp.X++; up.X++ }() { 512 dst.Draw(draw.Rect(x, y, x+1, y+1), src, tp, mask, up, draw.SoverD) 513 } 514 tp.X = sp.X 515 up.X = mp.X 516 } 517 memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange) 518 519 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 520 521 dst.Draw(dr, src, sp, mask, mp, draw.SoverD) 522 for y = 0; y < Yrange; y++ { 523 checkline(dr, draw.Repl(src.R, sp), draw.Repl(mask.R, mp), y, nil, nil) 524 } 525 } 526 527 func verifyrect() { 528 /* mask all zeros */ 529 memset(maskbits, 0, nbytes) 530 var i int 531 for i = 0; i < niters; i++ { 532 verifyrectmask() 533 } 534 535 /* mask all ones */ 536 memset(maskbits, 0xFF, nbytes) 537 for i = 0; i < niters; i++ { 538 verifyrectmask() 539 } 540 541 /* random mask */ 542 for i = 0; i < niters; i++ { 543 fill(mask, maskbits) 544 verifyrectmask() 545 } 546 } 547 548 func randrect() draw.Rectangle { 549 var r draw.Rectangle 550 r.Min.X = rand.Intn(Xrange - 1) 551 r.Min.Y = rand.Intn(Yrange - 1) 552 r.Max.X = r.Min.X + 1 + rand.Intn(Xrange-1-r.Min.X) 553 r.Max.Y = r.Min.Y + 1 + rand.Intn(Yrange-1-r.Min.Y) 554 return r 555 } 556 557 /* 558 * Return coordinate corresponding to x withing range [minx, maxx) 559 */ 560 func tilexy(minx int, maxx int, x int) int { 561 sx := (x - minx) % (maxx - minx) 562 if sx < 0 { 563 sx += maxx - minx 564 } 565 return sx + minx 566 } 567 568 func replicate(i *memdraw.Image, tmp *memdraw.Image) { 569 var r draw.Rectangle 570 /* choose the replication window (i->r) */ 571 r.Min.X = rand.Intn(Xrange - 1) 572 r.Min.Y = rand.Intn(Yrange - 1) 573 /* make it trivial more often than pure chance allows */ 574 switch rand.Int() & 0 { 575 case 1: 576 r.Max.X = r.Min.X + 2 577 r.Max.Y = r.Min.Y + 2 578 if r.Max.X < Xrange && r.Max.Y < Yrange { 579 break 580 } 581 fallthrough 582 /* fall through */ 583 case 0: 584 r.Max.X = r.Min.X + 1 585 r.Max.Y = r.Min.Y + 1 586 default: 587 if r.Min.X+3 >= Xrange { 588 r.Max.X = Xrange 589 } else { 590 r.Max.X = r.Min.X + 3 + rand.Intn(Xrange-(r.Min.X+3)) 591 } 592 593 if r.Min.Y+3 >= Yrange { 594 r.Max.Y = Yrange 595 } else { 596 r.Max.Y = r.Min.Y + 3 + rand.Intn(Yrange-(r.Min.Y+3)) 597 } 598 } 599 assert(r.Min.X >= 0) 600 assert(r.Max.X <= Xrange) 601 assert(r.Min.Y >= 0) 602 assert(r.Max.Y <= Yrange) 603 /* copy from i to tmp so we have just the replicated bits */ 604 nb := int(tmp.Width) * 4 * Yrange 605 memset(tmp.Data.Bdata, 0, nb) 606 tmp.Draw(r, i, r.Min, ones, r.Min, draw.SoverD) 607 memmove(i.Data.Bdata, tmp.Data.Bdata, nb) 608 /* i is now a non-replicated instance of the replication */ 609 /* replicate it by hand through tmp */ 610 memset(tmp.Data.Bdata, 0, nb) 611 x := -(tilexy(r.Min.X, r.Max.X, 0) - r.Min.X) 612 for ; x < Xrange; x += r.Dx() { 613 y := -(tilexy(r.Min.Y, r.Max.Y, 0) - r.Min.Y) 614 for ; y < Yrange; y += r.Dy() { 615 var r1 draw.Rectangle 616 /* set r1 to instance of tile by translation */ 617 r1.Min.X = x 618 r1.Min.Y = y 619 r1.Max.X = r1.Min.X + r.Dx() 620 r1.Max.Y = r1.Min.Y + r.Dy() 621 tmp.Draw(r1, i, r.Min, ones, r.Min, draw.SoverD) 622 } 623 } 624 i.Flags |= memdraw.Frepl 625 i.R = r 626 i.Clipr = randrect() 627 /* fprint(2, "replicate [[%d %d] [%d %d]] [[%d %d][%d %d]]\n", r.Min.X, r.Min.Y, r.Max.X, r.Max.Y, */ 628 /* i->clipr.Min.X, i->clipr.Min.Y, i->clipr.Max.X, i->clipr.Max.Y); */ 629 tmp.Clipr = i.Clipr 630 } 631 632 /* 633 * Mask is preset; do the rest 634 */ 635 func verifyrectmaskrepl(srcrepl int, maskrepl int) { 636 /* fmt.Fprintf(os.Stderr, "verfrect %d %d\n", srcrepl, maskrepl); */ 637 src.Flags &^= memdraw.Frepl 638 src.R = draw.Rect(0, 0, Xrange, Yrange) 639 src.Clipr = src.R 640 stmp.Flags &^= memdraw.Frepl 641 stmp.R = draw.Rect(0, 0, Xrange, Yrange) 642 stmp.Clipr = src.R 643 mask.Flags &^= memdraw.Frepl 644 mask.R = draw.Rect(0, 0, Xrange, Yrange) 645 mask.Clipr = mask.R 646 mtmp.Flags &^= memdraw.Frepl 647 mtmp.R = draw.Rect(0, 0, Xrange, Yrange) 648 mtmp.Clipr = mask.R 649 650 fill(dst, dstbits) 651 fill(src, srcbits) 652 653 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 654 memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange) 655 memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange) 656 var s *memdraw.Image 657 658 if srcrepl != 0 { 659 replicate(src, stmp) 660 s = stmp 661 } else { 662 s = src 663 } 664 var m *memdraw.Image 665 if maskrepl != 0 { 666 replicate(mask, mtmp) 667 m = mtmp 668 } else { 669 m = mask 670 } 671 672 dr := randrect() 673 var sp draw.Point 674 675 sp.X = rand.Intn(Xrange) 676 sp.Y = rand.Intn(Yrange) 677 var mp draw.Point 678 679 mp.X = rand.Intn(Xrange) 680 mp.Y = rand.Intn(Yrange) 681 682 if DBG != 0 { 683 fmt.Fprintf(os.Stderr, "smalldraws\n") 684 } 685 var tp draw.Point 686 tp.Y = sp.Y 687 var up draw.Point 688 up.Y = mp.Y 689 y := dr.Min.Y 690 for ; y < dr.Max.Y && tp.Y < Yrange && up.Y < Yrange; func() { y++; tp.Y++; up.Y++ }() { 691 tp.X = sp.X 692 up.X = mp.X 693 x := dr.Min.X 694 for ; x < dr.Max.X && tp.X < Xrange && up.X < Xrange; func() { x++; tp.X++; up.X++ }() { 695 dst.Draw(draw.Rect(x, y, x+1, y+1), s, tp, m, up, draw.SoverD) 696 } 697 } 698 memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange) 699 700 memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange) 701 702 if DBG != 0 { 703 fmt.Fprintf(os.Stderr, "bigdraw\n") 704 } 705 dst.Draw(dr, src, sp, mask, mp, draw.SoverD) 706 for y = 0; y < Yrange; y++ { 707 stmp := stmp 708 if srcrepl == 0 { 709 stmp = nil 710 } 711 mtmp := mtmp 712 if maskrepl == 0 { 713 mtmp = nil 714 } 715 checkline(dr, draw.Repl(src.R, sp), draw.Repl(mask.R, mp), y, stmp, mtmp) 716 } 717 } 718 719 func verifyrectrepl(srcrepl int, maskrepl int) { 720 if Xrange <= 1 || Yrange <= 1 { 721 return 722 } 723 /* mask all ones */ 724 memset(maskbits, 0xFF, nbytes) 725 var i int 726 for i = 0; i < niters; i++ { 727 verifyrectmaskrepl(srcrepl, maskrepl) 728 } 729 730 /* mask all zeros */ 731 memset(maskbits, 0, nbytes) 732 for i = 0; i < niters; i++ { 733 verifyrectmaskrepl(srcrepl, maskrepl) 734 } 735 736 /* random mask */ 737 for i = 0; i < niters; i++ { 738 fill(mask, maskbits) 739 verifyrectmaskrepl(srcrepl, maskrepl) 740 } 741 } 742 743 /* 744 * Trivial draw implementation. 745 * Color values are passed around as u32ints containing ααRRGGBB 746 */ 747 748 /* 749 * Convert v, which is nhave bits wide, into its nwant bits wide equivalent. 750 * Replicates to widen the value, truncates to narrow it. 751 */ 752 func replbits(v uint32, nhave, nwant uint) uint32 { 753 v &= (1 << nhave) - 1 754 for ; nhave < nwant; nhave *= 2 { 755 v |= v << nhave 756 } 757 v >>= (nhave - nwant) 758 return v & ((1 << nwant) - 1) 759 } 760 761 /* 762 * Decode a pixel into the uchar* values. 763 */ 764 func pixtorgba(v uint32) (r, g, b, a uint8) { 765 a = uint8(v >> 24) 766 r = uint8(v >> 16) 767 g = uint8(v >> 8) 768 b = uint8(v) 769 return 770 } 771 772 /* 773 * Convert uchar channels into u32int pixel. 774 */ 775 func rgbatopix(r uint8, g uint8, b uint8, a uint8) uint32 { 776 return uint32(a)<<24 | uint32(r)<<16 | uint32(g)<<8 | uint32(b) 777 } 778 779 /* 780 * Retrieve the pixel value at pt in the image. 781 */ 782 func getpixel(img *memdraw.Image, pt draw.Point) uint32 { 783 var r, g, b, a uint8 784 a = ^uint8(0) /* default alpha is full */ 785 786 p := img.BytesAt(pt) 787 v := uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 788 bpp := uint(img.Depth) 789 if bpp < 8 { 790 /* 791 * Sub-byte greyscale pixels. 792 * 793 * We want to throw away the top pt.X%npack pixels and then use the next bpp bits 794 * in the bottom byte of v. This madness is due to having big endian bits 795 * but little endian bytes. 796 */ 797 npack := 8 / bpp 798 v >>= 8 - bpp*(uint(pt.X)%npack+1) 799 v &= (1 << bpp) - 1 800 b = uint8(replbits(uint32(v), bpp, 8)) 801 g = b 802 r = g 803 } else { 804 /* 805 * General case. We need to parse the channel descriptor and do what it says. 806 * In all channels but the color map, we replicate to 8 bits because that's the 807 * precision that all calculations are done at. 808 * 809 * In the case of the color map, we leave the bits alone, in case a color map 810 * with less than 8 bits of index is used. This is currently disallowed, so it's 811 * sort of silly. 812 */ 813 814 for c := img.Pix; c != 0; c >>= 8 { 815 nbits := uint(c & 15) 816 typ := int(c>>4) & 15 817 bits := v & ((1 << nbits) - 1) 818 rbits := uint8(replbits(uint32(bits), nbits, 8)) 819 v >>= nbits 820 switch typ { 821 case draw.CRed: 822 r = rbits 823 case draw.CGreen: 824 g = rbits 825 case draw.CBlue: 826 b = rbits 827 case draw.CGrey: 828 b = rbits 829 g = b 830 r = g 831 case draw.CAlpha: 832 a = rbits 833 case draw.CMap: 834 p = cmap2rgb[3*int(bits):] 835 r = p[0] 836 g = p[1] 837 b = p[2] 838 if DBG != 0 { 839 fmt.Fprintf(os.Stderr, "%x -> %x %x %x\n", bits, r, g, b) 840 } 841 case draw.CIgnore: 842 break 843 default: 844 fmt.Fprintf(os.Stderr, "unknown channel type %d\n", typ) 845 panic("channel") 846 } 847 } 848 } 849 return rgbatopix(r, g, b, a) 850 } 851 852 /* 853 * Return the greyscale equivalent of a pixel. 854 */ 855 func getgrey(img *memdraw.Image, pt draw.Point) uint8 { 856 rgba := getpixel(img, pt) 857 r, g, b, _ := pixtorgba(rgba) 858 return RGB2K(r, g, b) 859 } 860 861 /* 862 * Return the value at pt in image, if image is interpreted 863 * as a mask. This means the alpha channel if present, else 864 * the greyscale or its computed equivalent. 865 */ 866 func getmask(img *memdraw.Image, pt draw.Point) uint8 { 867 if img.Flags&memdraw.Falpha != 0 { 868 return uint8(getpixel(img, pt) >> 24) 869 } else { 870 return getgrey(img, pt) 871 } 872 } 873 874 // #undef DBG 875 876 // #define DBG 0 877 /* 878 * Write a pixel to img at point pt. 879 * 880 * We do this by reading a 32-bit little endian 881 * value from p and then writing it back 882 * after tweaking the appropriate bits. Because 883 * the data is little endian, we don't have to worry 884 * about what the actual depth is, as long as it is 885 * less than 32 bits. 886 */ 887 func putpixel(img *memdraw.Image, pt draw.Point, nv uint32) { 888 r, g, b, a := pixtorgba(nv) 889 890 p := img.BytesAt(pt) 891 v := uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 892 bpp := uint(img.Depth) 893 if DBG != 0 { 894 fmt.Fprintf(os.Stderr, "v %.8x...", v) 895 } 896 if bpp < 8 { 897 /* 898 * Sub-byte greyscale pixels. We need to skip the leftmost pt.X%npack pixels, 899 * which is equivalent to skipping the rightmost npack - pt.X%npack - 1 pixels. 900 */ 901 npack := 8 / bpp 902 sh := bpp * (npack - uint(pt.X)%npack - 1) 903 bits := RGB2K(r, g, b) 904 if DBG != 0 { 905 fmt.Fprintf(os.Stderr, "repl %x 8 %d = %x...", bits, bpp, replbits(uint32(bits), 8, bpp)) 906 } 907 bits = uint8(replbits(uint32(bits), 8, bpp)) 908 mask := uint32(1<<bpp) - 1 909 if DBG != 0 { 910 fmt.Fprintf(os.Stderr, "bits %x mask %x sh %d...", bits, mask, sh) 911 } 912 mask <<= sh 913 bits <<= sh 914 if DBG != 0 { 915 fmt.Fprintf(os.Stderr, "(%x & %x) | (%x & %x)", v, ^mask, bits, mask) 916 } 917 v = v&^mask | uint32(bits)&mask 918 } else { 919 /* 920 * General case. We need to parse the channel descriptor again. 921 */ 922 sh := uint(0) 923 for c := img.Pix; c != 0; c >>= 8 { 924 nbits := uint(c & 15) 925 typ := int(c>>4) & 15 926 var q []uint8 927 var bits uint32 928 switch typ { 929 case draw.CRed: 930 bits = uint32(r) 931 case draw.CGreen: 932 bits = uint32(g) 933 case draw.CBlue: 934 bits = uint32(b) 935 case draw.CGrey: 936 bits = uint32(RGB2K(r, g, b)) 937 case draw.CAlpha: 938 bits = uint32(a) 939 case draw.CIgnore: 940 bits = 0 941 case draw.CMap: 942 q = rgb2cmap[:] 943 bits = uint32(q[(uint32(r)>>4)*16*16+(uint32(g)>>4)*16+(uint32(b)>>4)]) 944 if DBG != 0 { 945 fmt.Fprintf(os.Stderr, "%x %x %x -> %x\n", r, g, b, bits) 946 } 947 default: 948 fmt.Fprintf(os.Stderr, "unknown channel type %d\n", typ) 949 panic("channel") 950 } 951 952 if DBG != 0 { 953 fmt.Fprintf(os.Stderr, "repl %x 8 %d = %x...", bits, nbits, replbits(uint32(bits), 8, nbits)) 954 } 955 if typ != draw.CMap { 956 bits = replbits(uint32(bits), 8, nbits) 957 } 958 mask := uint32(1<<nbits) - 1 959 if DBG != 0 { 960 fmt.Fprintf(os.Stderr, "bits %x mask %x sh %d...", bits, mask, sh) 961 } 962 bits <<= sh 963 mask <<= sh 964 v = v&^mask | uint32(bits)&mask 965 sh += nbits 966 } 967 } 968 if DBG != 0 { 969 fmt.Fprintf(os.Stderr, "v %.8x\n", v) 970 } 971 p[0] = uint8(v) 972 p[1] = uint8(v >> 8) 973 p[2] = uint8(v >> 16) 974 p[3] = uint8(v >> 24) 975 } 976 977 func drawonepixel(dst *memdraw.Image, dp draw.Point, src *memdraw.Image, sp draw.Point, mask *memdraw.Image, mp draw.Point) { 978 dr, dg, db, da := pixtorgba(getpixel(dst, dp)) 979 sr, sg, sb, sa := pixtorgba(getpixel(src, sp)) 980 m := uint32(getmask(mask, mp)) 981 M := 255 - (uint32(sa)*m+127)/255 982 983 if DBG != 0 { 984 fmt.Fprintf(os.Stderr, "dst %x %x %x %x src %x %x %x %x m %x M %x = ", dr, dg, db, da, sr, sg, sb, sa, m, M) 985 } 986 if dst.Flags&memdraw.Fgrey != 0 { 987 /* 988 * We need to do the conversion to grey before the alpha calculation 989 * because the draw operator does this, and we need to be operating 990 * at the same precision so we get exactly the same answers. 991 */ 992 sk := RGB2K(sr, sg, sb) 993 dk := RGB2K(dr, dg, db) 994 dk = uint8((uint32(sk)*m + uint32(dk)*M + 127) / 255) 995 db = dk 996 dg = db 997 dr = dg 998 da = uint8((uint32(sa)*m + uint32(da)*M + 127) / 255) 999 } else { 1000 /* 1001 * True color alpha calculation treats all channels (including alpha) 1002 * the same. It might have been nice to use an array, but oh well. 1003 */ 1004 dr = uint8((uint32(sr)*m + uint32(dr)*M + 127) / 255) 1005 dg = uint8((uint32(sg)*m + uint32(dg)*M + 127) / 255) 1006 db = uint8((uint32(sb)*m + uint32(db)*M + 127) / 255) 1007 da = uint8((uint32(sa)*m + uint32(da)*M + 127) / 255) 1008 } 1009 1010 if DBG != 0 { 1011 fmt.Fprintf(os.Stderr, "%x %x %x %x %x\n", dr, dg, db, da, rgbatopix(dr, dg, db, da)) 1012 } 1013 putpixel(dst, dp, rgbatopix(dr, dg, db, da)) 1014 } 1015 1016 var cmap2rgb = [...]uint8{ 1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x00, 1018 0x44, 0x44, 0x00, 0x44, 0x88, 0x00, 0x44, 0xcc, 0x00, 0x88, 0x00, 0x00, 0x88, 0x44, 0x00, 0x88, 1019 0x88, 0x00, 0x88, 0xcc, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0x44, 0x00, 0xcc, 0x88, 0x00, 0xcc, 0xcc, 1020 0x00, 0xdd, 0xdd, 0x11, 0x11, 0x11, 0x00, 0x00, 0x55, 0x00, 0x00, 0x99, 0x00, 0x00, 0xdd, 0x00, 1021 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x4c, 0x99, 0x00, 0x49, 0xdd, 0x00, 0x99, 0x00, 0x00, 0x99, 1022 0x4c, 0x00, 0x99, 0x99, 0x00, 0x93, 0xdd, 0x00, 0xdd, 0x00, 0x00, 0xdd, 0x49, 0x00, 0xdd, 0x93, 1023 0x00, 0xee, 0x9e, 0x00, 0xee, 0xee, 0x22, 0x22, 0x22, 0x00, 0x00, 0x66, 0x00, 0x00, 0xaa, 0x00, 1024 0x00, 0xee, 0x00, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x55, 0xaa, 0x00, 0x4f, 0xee, 0x00, 0xaa, 1025 0x00, 0x00, 0xaa, 0x55, 0x00, 0xaa, 0xaa, 0x00, 0x9e, 0xee, 0x00, 0xee, 0x00, 0x00, 0xee, 0x4f, 1026 0x00, 0xff, 0x55, 0x00, 0xff, 0xaa, 0x00, 0xff, 0xff, 0x33, 0x33, 0x33, 0x00, 0x00, 0x77, 0x00, 1027 0x00, 0xbb, 0x00, 0x00, 0xff, 0x00, 0x77, 0x00, 0x00, 0x77, 0x77, 0x00, 0x5d, 0xbb, 0x00, 0x55, 1028 0xff, 0x00, 0xbb, 0x00, 0x00, 0xbb, 0x5d, 0x00, 0xbb, 0xbb, 0x00, 0xaa, 0xff, 0x00, 0xff, 0x00, 1029 0x44, 0x00, 0x44, 0x44, 0x00, 0x88, 0x44, 0x00, 0xcc, 0x44, 0x44, 0x00, 0x44, 0x44, 0x44, 0x44, 1030 0x44, 0x88, 0x44, 0x44, 0xcc, 0x44, 0x88, 0x00, 0x44, 0x88, 0x44, 0x44, 0x88, 0x88, 0x44, 0x88, 1031 0xcc, 0x44, 0xcc, 0x00, 0x44, 0xcc, 0x44, 0x44, 0xcc, 0x88, 0x44, 0xcc, 0xcc, 0x44, 0x00, 0x00, 1032 0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x4c, 0x00, 0x99, 0x49, 0x00, 0xdd, 0x55, 0x55, 0x00, 0x55, 1033 0x55, 0x55, 0x4c, 0x4c, 0x99, 0x49, 0x49, 0xdd, 0x4c, 0x99, 0x00, 0x4c, 0x99, 0x4c, 0x4c, 0x99, 1034 0x99, 0x49, 0x93, 0xdd, 0x49, 0xdd, 0x00, 0x49, 0xdd, 0x49, 0x49, 0xdd, 0x93, 0x49, 0xdd, 0xdd, 1035 0x4f, 0xee, 0xee, 0x66, 0x00, 0x00, 0x66, 0x00, 0x66, 0x55, 0x00, 0xaa, 0x4f, 0x00, 0xee, 0x66, 1036 0x66, 0x00, 0x66, 0x66, 0x66, 0x55, 0x55, 0xaa, 0x4f, 0x4f, 0xee, 0x55, 0xaa, 0x00, 0x55, 0xaa, 1037 0x55, 0x55, 0xaa, 0xaa, 0x4f, 0x9e, 0xee, 0x4f, 0xee, 0x00, 0x4f, 0xee, 0x4f, 0x4f, 0xee, 0x9e, 1038 0x55, 0xff, 0xaa, 0x55, 0xff, 0xff, 0x77, 0x00, 0x00, 0x77, 0x00, 0x77, 0x5d, 0x00, 0xbb, 0x55, 1039 0x00, 0xff, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x5d, 0x5d, 0xbb, 0x55, 0x55, 0xff, 0x5d, 0xbb, 1040 0x00, 0x5d, 0xbb, 0x5d, 0x5d, 0xbb, 0xbb, 0x55, 0xaa, 0xff, 0x55, 0xff, 0x00, 0x55, 0xff, 0x55, 1041 0x88, 0x00, 0x88, 0x88, 0x00, 0xcc, 0x88, 0x44, 0x00, 0x88, 0x44, 0x44, 0x88, 0x44, 0x88, 0x88, 1042 0x44, 0xcc, 0x88, 0x88, 0x00, 0x88, 0x88, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0xcc, 0x88, 0xcc, 1043 0x00, 0x88, 0xcc, 0x44, 0x88, 0xcc, 0x88, 0x88, 0xcc, 0xcc, 0x88, 0x00, 0x00, 0x88, 0x00, 0x44, 1044 0x99, 0x00, 0x4c, 0x99, 0x00, 0x99, 0x93, 0x00, 0xdd, 0x99, 0x4c, 0x00, 0x99, 0x4c, 0x4c, 0x99, 1045 0x4c, 0x99, 0x93, 0x49, 0xdd, 0x99, 0x99, 0x00, 0x99, 0x99, 0x4c, 0x99, 0x99, 0x99, 0x93, 0x93, 1046 0xdd, 0x93, 0xdd, 0x00, 0x93, 0xdd, 0x49, 0x93, 0xdd, 0x93, 0x93, 0xdd, 0xdd, 0x99, 0x00, 0x00, 1047 0xaa, 0x00, 0x00, 0xaa, 0x00, 0x55, 0xaa, 0x00, 0xaa, 0x9e, 0x00, 0xee, 0xaa, 0x55, 0x00, 0xaa, 1048 0x55, 0x55, 0xaa, 0x55, 0xaa, 0x9e, 0x4f, 0xee, 0xaa, 0xaa, 0x00, 0xaa, 0xaa, 0x55, 0xaa, 0xaa, 1049 0xaa, 0x9e, 0x9e, 0xee, 0x9e, 0xee, 0x00, 0x9e, 0xee, 0x4f, 0x9e, 0xee, 0x9e, 0x9e, 0xee, 0xee, 1050 0xaa, 0xff, 0xff, 0xbb, 0x00, 0x00, 0xbb, 0x00, 0x5d, 0xbb, 0x00, 0xbb, 0xaa, 0x00, 0xff, 0xbb, 1051 0x5d, 0x00, 0xbb, 0x5d, 0x5d, 0xbb, 0x5d, 0xbb, 0xaa, 0x55, 0xff, 0xbb, 0xbb, 0x00, 0xbb, 0xbb, 1052 0x5d, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xff, 0xaa, 0xff, 0x00, 0xaa, 0xff, 0x55, 0xaa, 0xff, 0xaa, 1053 0xcc, 0x00, 0xcc, 0xcc, 0x44, 0x00, 0xcc, 0x44, 0x44, 0xcc, 0x44, 0x88, 0xcc, 0x44, 0xcc, 0xcc, 1054 0x88, 0x00, 0xcc, 0x88, 0x44, 0xcc, 0x88, 0x88, 0xcc, 0x88, 0xcc, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 1055 0x44, 0xcc, 0xcc, 0x88, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x44, 0xcc, 0x00, 0x88, 1056 0xdd, 0x00, 0x93, 0xdd, 0x00, 0xdd, 0xdd, 0x49, 0x00, 0xdd, 0x49, 0x49, 0xdd, 0x49, 0x93, 0xdd, 1057 0x49, 0xdd, 0xdd, 0x93, 0x00, 0xdd, 0x93, 0x49, 0xdd, 0x93, 0x93, 0xdd, 0x93, 0xdd, 0xdd, 0xdd, 1058 0x00, 0xdd, 0xdd, 0x49, 0xdd, 0xdd, 0x93, 0xdd, 0xdd, 0xdd, 0xdd, 0x00, 0x00, 0xdd, 0x00, 0x49, 1059 0xee, 0x00, 0x4f, 0xee, 0x00, 0x9e, 0xee, 0x00, 0xee, 0xee, 0x4f, 0x00, 0xee, 0x4f, 0x4f, 0xee, 1060 0x4f, 0x9e, 0xee, 0x4f, 0xee, 0xee, 0x9e, 0x00, 0xee, 0x9e, 0x4f, 0xee, 0x9e, 0x9e, 0xee, 0x9e, 1061 0xee, 0xee, 0xee, 0x00, 0xee, 0xee, 0x4f, 0xee, 0xee, 0x9e, 0xee, 0xee, 0xee, 0xee, 0x00, 0x00, 1062 0xff, 0x00, 0x00, 0xff, 0x00, 0x55, 0xff, 0x00, 0xaa, 0xff, 0x00, 0xff, 0xff, 0x55, 0x00, 0xff, 1063 0x55, 0x55, 0xff, 0x55, 0xaa, 0xff, 0x55, 0xff, 0xff, 0xaa, 0x00, 0xff, 0xaa, 0x55, 0xff, 0xaa, 1064 0xaa, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x55, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 1065 } 1066 1067 var rgb2cmap = [...]uint8{ 1068 0x00, 0x00, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1069 0x00, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1070 0x11, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1071 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x17, 0x07, 0x07, 0x18, 0x18, 0x29, 1072 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x16, 0x06, 0x06, 0x17, 0x28, 0x07, 0x07, 0x18, 0x29, 0x3a, 1073 0x15, 0x15, 0x15, 0x05, 0x05, 0x16, 0x16, 0x06, 0x06, 0x17, 0x28, 0x39, 0x07, 0x18, 0x29, 0x3a, 1074 0x26, 0x26, 0x26, 0x05, 0x16, 0x16, 0x27, 0x27, 0x38, 0x28, 0x28, 0x39, 0x39, 0x29, 0x29, 0x3a, 1075 0x37, 0x37, 0x37, 0x09, 0x09, 0x09, 0x27, 0x38, 0x0a, 0x0a, 0x39, 0x0b, 0x0b, 0x0b, 0x1c, 0x3a, 1076 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x38, 0x0a, 0x0a, 0x0a, 0x1b, 0x0b, 0x0b, 0x1c, 0x1c, 0x2d, 1077 0x19, 0x19, 0x19, 0x09, 0x1a, 0x1a, 0x2b, 0x0a, 0x0a, 0x1b, 0x1b, 0x0b, 0x0b, 0x1c, 0x2d, 0x3e, 1078 0x2a, 0x2a, 0x2a, 0x1a, 0x2b, 0x2b, 0x2b, 0x3c, 0x1b, 0x1b, 0x2c, 0x2c, 0x3d, 0x2d, 0x2d, 0x3e, 1079 0x3b, 0x3b, 0x3b, 0x0d, 0x0d, 0x3c, 0x3c, 0x0e, 0x0e, 0x0e, 0x2c, 0x3d, 0x0f, 0x0f, 0x3e, 0x3e, 1080 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x3c, 0x0e, 0x0e, 0x0e, 0x3d, 0x0f, 0x0f, 0x0f, 0x10, 0x3e, 1081 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x2f, 0x0e, 0x1f, 0x1f, 0x20, 0x0f, 0x0f, 0x10, 0x10, 0x21, 1082 0x2e, 0x2e, 0x2e, 0x1e, 0x2f, 0x2f, 0x2f, 0x1f, 0x1f, 0x20, 0x20, 0x31, 0x10, 0x10, 0x21, 0x21, 1083 0x3f, 0x3f, 0x3f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x31, 0x31, 0x31, 0x21, 0x21, 0x32, 1084 0x00, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1085 0x11, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1086 0x11, 0x11, 0x22, 0x22, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1087 0x04, 0x04, 0x22, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x17, 0x07, 0x07, 0x18, 0x18, 0x29, 1088 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x16, 0x06, 0x06, 0x17, 0x28, 0x07, 0x07, 0x18, 0x29, 0x3a, 1089 0x15, 0x15, 0x15, 0x05, 0x05, 0x16, 0x16, 0x06, 0x06, 0x17, 0x28, 0x39, 0x07, 0x18, 0x29, 0x3a, 1090 0x26, 0x26, 0x26, 0x05, 0x16, 0x16, 0x27, 0x27, 0x38, 0x28, 0x28, 0x39, 0x39, 0x29, 0x29, 0x3a, 1091 0x37, 0x37, 0x37, 0x09, 0x09, 0x09, 0x27, 0x38, 0x0a, 0x0a, 0x39, 0x0b, 0x0b, 0x0b, 0x1c, 0x3a, 1092 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x38, 0x0a, 0x0a, 0x0a, 0x1b, 0x0b, 0x0b, 0x1c, 0x1c, 0x2d, 1093 0x19, 0x19, 0x19, 0x09, 0x1a, 0x1a, 0x2b, 0x0a, 0x0a, 0x1b, 0x1b, 0x0b, 0x0b, 0x1c, 0x2d, 0x3e, 1094 0x2a, 0x2a, 0x2a, 0x1a, 0x2b, 0x2b, 0x2b, 0x3c, 0x1b, 0x1b, 0x2c, 0x2c, 0x3d, 0x2d, 0x2d, 0x3e, 1095 0x3b, 0x3b, 0x3b, 0x0d, 0x0d, 0x3c, 0x3c, 0x0e, 0x0e, 0x0e, 0x2c, 0x3d, 0x0f, 0x0f, 0x3e, 0x3e, 1096 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x3c, 0x0e, 0x0e, 0x0e, 0x3d, 0x0f, 0x0f, 0x0f, 0x10, 0x3e, 1097 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x2f, 0x0e, 0x1f, 0x1f, 0x20, 0x0f, 0x0f, 0x10, 0x10, 0x21, 1098 0x2e, 0x2e, 0x2e, 0x1e, 0x2f, 0x2f, 0x2f, 0x1f, 0x1f, 0x20, 0x20, 0x31, 0x10, 0x10, 0x21, 0x21, 1099 0x3f, 0x3f, 0x3f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x31, 0x31, 0x31, 0x21, 0x21, 0x32, 1100 0x11, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1101 0x11, 0x11, 0x22, 0x22, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1102 0x11, 0x22, 0x22, 0x22, 0x33, 0x33, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36, 1103 0x04, 0x22, 0x22, 0x33, 0x33, 0x33, 0x05, 0x06, 0x06, 0x06, 0x17, 0x07, 0x07, 0x18, 0x18, 0x29, 1104 0x04, 0x04, 0x33, 0x33, 0x33, 0x05, 0x16, 0x06, 0x06, 0x17, 0x28, 0x07, 0x07, 0x18, 0x29, 0x3a, 1105 0x15, 0x15, 0x33, 0x33, 0x05, 0x16, 0x16, 0x06, 0x06, 0x17, 0x28, 0x39, 0x07, 0x18, 0x29, 0x3a, 1106 0x26, 0x26, 0x26, 0x05, 0x16, 0x16, 0x27, 0x27, 0x38, 0x28, 0x28, 0x39, 0x39, 0x29, 0x29, 0x3a, 1107 0x37, 0x37, 0x37, 0x09, 0x09, 0x09, 0x27, 0x38, 0x0a, 0x0a, 0x39, 0x0b, 0x0b, 0x0b, 0x1c, 0x3a, 1108 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x38, 0x0a, 0x0a, 0x0a, 0x1b, 0x0b, 0x0b, 0x1c, 0x1c, 0x2d, 1109 0x19, 0x19, 0x19, 0x09, 0x1a, 0x1a, 0x2b, 0x0a, 0x0a, 0x1b, 0x1b, 0x0b, 0x0b, 0x1c, 0x2d, 0x3e, 1110 0x2a, 0x2a, 0x2a, 0x1a, 0x2b, 0x2b, 0x2b, 0x3c, 0x1b, 0x1b, 0x2c, 0x2c, 0x3d, 0x2d, 0x2d, 0x3e, 1111 0x3b, 0x3b, 0x3b, 0x0d, 0x0d, 0x3c, 0x3c, 0x0e, 0x0e, 0x0e, 0x2c, 0x3d, 0x0f, 0x0f, 0x3e, 0x3e, 1112 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x3c, 0x0e, 0x0e, 0x0e, 0x3d, 0x0f, 0x0f, 0x0f, 0x10, 0x3e, 1113 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x2f, 0x0e, 0x1f, 0x1f, 0x20, 0x0f, 0x0f, 0x10, 0x10, 0x21, 1114 0x2e, 0x2e, 0x2e, 0x1e, 0x2f, 0x2f, 0x2f, 0x1f, 0x1f, 0x20, 0x20, 0x31, 0x10, 0x10, 0x21, 0x21, 1115 0x3f, 0x3f, 0x3f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x31, 0x31, 0x31, 0x21, 0x21, 0x32, 1116 0x4f, 0x4f, 0x22, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x52, 0x42, 0x42, 0x53, 0x53, 0x64, 1117 0x4f, 0x22, 0x22, 0x22, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x52, 0x42, 0x42, 0x53, 0x53, 0x64, 1118 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x40, 0x41, 0x41, 0x41, 0x52, 0x42, 0x42, 0x53, 0x53, 0x64, 1119 0x43, 0x22, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x45, 0x45, 0x56, 0x46, 0x46, 0x46, 0x57, 0x68, 1120 0x43, 0x43, 0x33, 0x33, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x56, 0x46, 0x46, 0x57, 0x57, 0x68, 1121 0x43, 0x43, 0x33, 0x44, 0x44, 0x44, 0x55, 0x45, 0x45, 0x56, 0x56, 0x46, 0x46, 0x57, 0x68, 0x68, 1122 0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79, 1123 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x5b, 0x79, 1124 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x5a, 0x4a, 0x4a, 0x4a, 0x5b, 0x6c, 1125 0x47, 0x47, 0x47, 0x48, 0x48, 0x59, 0x59, 0x49, 0x49, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x5b, 0x6c, 1126 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x6a, 0x49, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x5b, 0x6c, 0x7d, 1127 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x6b, 0x4e, 0x4e, 0x4e, 0x6c, 0x7d, 1128 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x5e, 0x4e, 0x4e, 0x4e, 0x5f, 0x5f, 1129 0x5c, 0x5c, 0x5c, 0x4c, 0x5d, 0x5d, 0x5d, 0x4d, 0x4d, 0x5e, 0x5e, 0x4e, 0x4e, 0x5f, 0x5f, 0x60, 1130 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x6e, 0x6e, 0x5e, 0x5e, 0x5e, 0x6f, 0x6f, 0x5f, 0x5f, 0x60, 0x60, 1131 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x7f, 0x7f, 0x6f, 0x6f, 0x70, 0x70, 0x5f, 0x60, 0x60, 0x71, 1132 0x4f, 0x4f, 0x40, 0x40, 0x40, 0x40, 0x51, 0x41, 0x41, 0x52, 0x63, 0x42, 0x42, 0x53, 0x64, 0x75, 1133 0x4f, 0x4f, 0x22, 0x40, 0x40, 0x40, 0x51, 0x41, 0x41, 0x52, 0x63, 0x42, 0x42, 0x53, 0x64, 0x75, 1134 0x43, 0x22, 0x33, 0x33, 0x33, 0x40, 0x51, 0x41, 0x41, 0x52, 0x63, 0x42, 0x42, 0x53, 0x64, 0x75, 1135 0x43, 0x43, 0x33, 0x33, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x56, 0x46, 0x46, 0x57, 0x57, 0x68, 1136 0x43, 0x43, 0x33, 0x44, 0x44, 0x44, 0x55, 0x45, 0x45, 0x56, 0x56, 0x46, 0x46, 0x57, 0x68, 0x68, 1137 0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79, 1138 0x54, 0x54, 0x54, 0x44, 0x55, 0x55, 0x55, 0x45, 0x56, 0x56, 0x67, 0x78, 0x78, 0x57, 0x68, 0x79, 1139 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x5b, 0x79, 1140 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x59, 0x49, 0x49, 0x49, 0x5a, 0x4a, 0x4a, 0x5b, 0x5b, 0x6c, 1141 0x58, 0x58, 0x58, 0x48, 0x59, 0x59, 0x59, 0x49, 0x49, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x6c, 0x6c, 1142 0x69, 0x69, 0x69, 0x59, 0x59, 0x6a, 0x6a, 0x49, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x5b, 0x6c, 0x7d, 1143 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x7b, 0x4d, 0x4d, 0x4d, 0x6b, 0x4e, 0x4e, 0x4e, 0x7d, 0x7d, 1144 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x7b, 0x4d, 0x4d, 0x4d, 0x5e, 0x4e, 0x4e, 0x4e, 0x5f, 0x7d, 1145 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x4d, 0x5e, 0x5e, 0x5e, 0x4e, 0x4e, 0x5f, 0x5f, 0x60, 1146 0x6d, 0x6d, 0x6d, 0x5d, 0x6e, 0x6e, 0x6e, 0x5e, 0x5e, 0x6f, 0x6f, 0x70, 0x5f, 0x5f, 0x60, 0x60, 1147 0x7e, 0x7e, 0x7e, 0x6e, 0x6e, 0x7f, 0x7f, 0x7f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x60, 0x60, 0x71, 1148 0x50, 0x50, 0x50, 0x40, 0x40, 0x51, 0x51, 0x41, 0x41, 0x52, 0x63, 0x74, 0x42, 0x53, 0x64, 0x75, 1149 0x50, 0x50, 0x50, 0x40, 0x40, 0x51, 0x51, 0x41, 0x41, 0x52, 0x63, 0x74, 0x42, 0x53, 0x64, 0x75, 1150 0x50, 0x50, 0x33, 0x33, 0x40, 0x51, 0x51, 0x41, 0x41, 0x52, 0x63, 0x74, 0x42, 0x53, 0x64, 0x75, 1151 0x43, 0x43, 0x33, 0x44, 0x44, 0x44, 0x55, 0x45, 0x45, 0x56, 0x56, 0x46, 0x46, 0x57, 0x68, 0x68, 1152 0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79, 1153 0x54, 0x54, 0x54, 0x44, 0x55, 0x55, 0x55, 0x45, 0x56, 0x56, 0x67, 0x78, 0x78, 0x57, 0x68, 0x79, 1154 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x66, 0x66, 0x56, 0x67, 0x67, 0x78, 0x78, 0x68, 0x68, 0x79, 1155 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x66, 0x49, 0x49, 0x49, 0x78, 0x78, 0x4a, 0x4a, 0x5b, 0x79, 1156 0x47, 0x47, 0x47, 0x48, 0x48, 0x59, 0x59, 0x49, 0x49, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x6c, 0x6c, 1157 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x6a, 0x49, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x5b, 0x6c, 0x7d, 1158 0x69, 0x69, 0x69, 0x59, 0x6a, 0x6a, 0x6a, 0x7b, 0x5a, 0x6b, 0x6b, 0x6b, 0x7c, 0x6c, 0x6c, 0x7d, 1159 0x7a, 0x7a, 0x7a, 0x4c, 0x4c, 0x7b, 0x7b, 0x7b, 0x4d, 0x6b, 0x6b, 0x7c, 0x7c, 0x4e, 0x7d, 0x7d, 1160 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x7b, 0x7b, 0x4d, 0x4d, 0x5e, 0x7c, 0x7c, 0x4e, 0x5f, 0x5f, 0x7d, 1161 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x6e, 0x4d, 0x5e, 0x5e, 0x6f, 0x4e, 0x5f, 0x5f, 0x60, 0x60, 1162 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x5e, 0x6f, 0x6f, 0x6f, 0x70, 0x5f, 0x60, 0x60, 0x71, 1163 0x7e, 0x7e, 0x7e, 0x6e, 0x7f, 0x7f, 0x7f, 0x7f, 0x6f, 0x70, 0x70, 0x70, 0x70, 0x60, 0x71, 0x71, 1164 0x61, 0x61, 0x61, 0x40, 0x51, 0x51, 0x62, 0x62, 0x73, 0x63, 0x63, 0x74, 0x74, 0x64, 0x64, 0x75, 1165 0x61, 0x61, 0x61, 0x40, 0x51, 0x51, 0x62, 0x62, 0x73, 0x63, 0x63, 0x74, 0x74, 0x64, 0x64, 0x75, 1166 0x61, 0x61, 0x61, 0x40, 0x51, 0x51, 0x62, 0x62, 0x73, 0x63, 0x63, 0x74, 0x74, 0x64, 0x64, 0x75, 1167 0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79, 1168 0x54, 0x54, 0x54, 0x44, 0x55, 0x55, 0x55, 0x45, 0x56, 0x56, 0x67, 0x78, 0x78, 0x57, 0x68, 0x79, 1169 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x66, 0x66, 0x56, 0x67, 0x67, 0x78, 0x78, 0x68, 0x68, 0x79, 1170 0x65, 0x65, 0x65, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x67, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79, 1171 0x65, 0x65, 0x65, 0x48, 0x48, 0x66, 0x66, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x5b, 0x79, 0x79, 1172 0x76, 0x76, 0x76, 0x48, 0x59, 0x59, 0x77, 0x77, 0x77, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x6c, 0x6c, 1173 0x69, 0x69, 0x69, 0x59, 0x59, 0x6a, 0x6a, 0x77, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x6c, 0x6c, 0x7d, 1174 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x7b, 0x7b, 0x5a, 0x6b, 0x6b, 0x7c, 0x7c, 0x6c, 0x7d, 0x7d, 1175 0x7a, 0x7a, 0x7a, 0x4c, 0x7b, 0x7b, 0x7b, 0x7b, 0x4d, 0x6b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 1176 0x7a, 0x7a, 0x7a, 0x4c, 0x7b, 0x7b, 0x7b, 0x7b, 0x4d, 0x5e, 0x7c, 0x7c, 0x7c, 0x5f, 0x5f, 0x7d, 1177 0x6d, 0x6d, 0x6d, 0x5d, 0x5d, 0x6e, 0x7b, 0x5e, 0x5e, 0x6f, 0x6f, 0x7c, 0x5f, 0x5f, 0x60, 0x60, 1178 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x7f, 0x7f, 0x6f, 0x6f, 0x70, 0x70, 0x5f, 0x60, 0x60, 0x71, 1179 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x6f, 0x70, 0x70, 0x70, 0x70, 0x60, 0x71, 0x71, 1180 0x72, 0x72, 0x72, 0x8f, 0x8f, 0x62, 0x62, 0x73, 0x73, 0x80, 0x74, 0x81, 0x81, 0x81, 0x92, 0x75, 1181 0x72, 0x72, 0x72, 0x8f, 0x8f, 0x62, 0x62, 0x73, 0x73, 0x80, 0x74, 0x81, 0x81, 0x81, 0x92, 0x75, 1182 0x72, 0x72, 0x72, 0x83, 0x83, 0x62, 0x62, 0x73, 0x73, 0x80, 0x74, 0x81, 0x81, 0x81, 0x92, 0x75, 1183 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x96, 0x79, 1184 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x66, 0x84, 0x84, 0x84, 0x67, 0x85, 0x85, 0x85, 0x96, 0x79, 1185 0x65, 0x65, 0x65, 0x83, 0x83, 0x66, 0x66, 0x66, 0x84, 0x84, 0x78, 0x78, 0x85, 0x85, 0x96, 0x79, 1186 0x65, 0x65, 0x65, 0x83, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x96, 0x79, 0x79, 1187 0x76, 0x76, 0x76, 0x87, 0x87, 0x66, 0x77, 0x77, 0x77, 0x88, 0x78, 0x89, 0x89, 0x89, 0x89, 0x79, 1188 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x9a, 0x9a, 1189 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x77, 0x88, 0x88, 0x88, 0x6b, 0x89, 0x89, 0x9a, 0x9a, 0x7d, 1190 0x7a, 0x7a, 0x7a, 0x87, 0x6a, 0x7b, 0x7b, 0x7b, 0x88, 0x6b, 0x6b, 0x7c, 0x7c, 0x9a, 0x7d, 0x7d, 1191 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x7b, 0x7b, 0x8c, 0x8c, 0x8c, 0x7c, 0x7c, 0x8d, 0x8d, 0x7d, 0x7d, 1192 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x7b, 0x8c, 0x8c, 0x8c, 0x7c, 0x8d, 0x8d, 0x8d, 0x9e, 0x9e, 1193 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x9c, 0x8c, 0x8c, 0x9d, 0x9d, 0x8d, 0x8d, 0x9e, 0x9e, 0x9e, 1194 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0x7f, 0x8c, 0x9d, 0x9d, 0x70, 0x70, 0x9e, 0x9e, 0x9e, 0x71, 1195 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x9d, 0x70, 0x70, 0x70, 0x9e, 0x9e, 0x71, 0x71, 1196 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x73, 0x73, 0x80, 0x80, 0x91, 0x81, 0x81, 0x92, 0x92, 0xa3, 1197 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x73, 0x73, 0x80, 0x80, 0x91, 0x81, 0x81, 0x92, 0x92, 0xa3, 1198 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x73, 0x73, 0x80, 0x80, 0x91, 0x81, 0x81, 0x92, 0x92, 0xa3, 1199 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x95, 0x85, 0x85, 0x85, 0x96, 0xa7, 1200 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x94, 0x84, 0x84, 0x84, 0x95, 0x85, 0x85, 0x96, 0x96, 0xa7, 1201 0x82, 0x82, 0x82, 0x83, 0x83, 0x94, 0x94, 0x84, 0x84, 0x95, 0x95, 0x85, 0x85, 0x96, 0xa7, 0xa7, 1202 0x76, 0x76, 0x76, 0x83, 0x94, 0x94, 0x77, 0x77, 0x77, 0x95, 0x95, 0x85, 0x85, 0x96, 0xa7, 0xa7, 1203 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x9a, 0x9a, 1204 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x77, 0x88, 0x88, 0x88, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xab, 1205 0x86, 0x86, 0x86, 0x87, 0x87, 0x98, 0x98, 0x88, 0x88, 0x99, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xab, 1206 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, 0x88, 0x99, 0x99, 0x99, 0x89, 0x9a, 0x9a, 0xab, 0xab, 1207 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0xab, 0xbc, 1208 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x9d, 0x8d, 0x8d, 0x8d, 0x9e, 0x9e, 1209 0x9b, 0x9b, 0x9b, 0x8b, 0x9c, 0x9c, 0x9c, 0x8c, 0x9d, 0x9d, 0x9d, 0x8d, 0x8d, 0x9e, 0x9e, 0xaf, 1210 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0xad, 0xad, 0x9d, 0x9d, 0x9d, 0xae, 0xae, 0x9e, 0x9e, 0xaf, 0xaf, 1211 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0x9d, 0xae, 0xae, 0xae, 0xbf, 0x9e, 0xaf, 0xaf, 0xaf, 1212 0x9f, 0x9f, 0x9f, 0x8f, 0x90, 0x90, 0xa1, 0x80, 0x80, 0x91, 0x91, 0x81, 0x81, 0x92, 0xa3, 0xb4, 1213 0x9f, 0x9f, 0x9f, 0x8f, 0x90, 0x90, 0xa1, 0x80, 0x80, 0x91, 0x91, 0x81, 0x81, 0x92, 0xa3, 0xb4, 1214 0x9f, 0x9f, 0x9f, 0x83, 0x90, 0x90, 0xa1, 0x80, 0x80, 0x91, 0x91, 0x81, 0x81, 0x92, 0xa3, 0xb4, 1215 0x82, 0x82, 0x82, 0x83, 0x83, 0x94, 0x94, 0x84, 0x84, 0x95, 0x95, 0x85, 0x85, 0x96, 0x96, 0xa7, 1216 0x93, 0x93, 0x93, 0x83, 0x94, 0x94, 0x94, 0x84, 0x84, 0x95, 0x95, 0x85, 0x85, 0x96, 0xa7, 0xa7, 1217 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0xa5, 0x84, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0x96, 0xa7, 0xb8, 1218 0xa4, 0xa4, 0xa4, 0x94, 0x94, 0xa5, 0xa5, 0x77, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0xa7, 0xa7, 0xb8, 1219 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x77, 0x88, 0x88, 0x88, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xb8, 1220 0x86, 0x86, 0x86, 0x87, 0x87, 0x98, 0x98, 0x88, 0x88, 0x99, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xab, 1221 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, 0x88, 0x99, 0x99, 0x99, 0x89, 0x9a, 0x9a, 0xab, 0xab, 1222 0x97, 0x97, 0x97, 0x98, 0x98, 0xa9, 0xa9, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0x9a, 0xab, 0xab, 0xbc, 1223 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0xa9, 0xa9, 0x8c, 0x8c, 0x8c, 0xaa, 0x8d, 0x8d, 0x8d, 0xab, 0xbc, 1224 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x9c, 0x9c, 0x8c, 0x8c, 0x9d, 0x9d, 0x8d, 0x8d, 0x9e, 0x9e, 0xbc, 1225 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0xad, 0x9d, 0x9d, 0x9d, 0xae, 0x8d, 0x9e, 0x9e, 0xaf, 0xaf, 1226 0xac, 0xac, 0xac, 0x9c, 0xad, 0xad, 0xad, 0x9d, 0x9d, 0xae, 0xae, 0xae, 0x9e, 0xaf, 0xaf, 0xaf, 1227 0xbd, 0xbd, 0xbd, 0xad, 0xad, 0xbe, 0xbe, 0xbe, 0xae, 0xae, 0xbf, 0xbf, 0xbf, 0xaf, 0xaf, 0xb0, 1228 0xa0, 0xa0, 0xa0, 0x90, 0xa1, 0xa1, 0xa1, 0xb2, 0x91, 0x91, 0xa2, 0xa2, 0xb3, 0xa3, 0xa3, 0xb4, 1229 0xa0, 0xa0, 0xa0, 0x90, 0xa1, 0xa1, 0xa1, 0xb2, 0x91, 0x91, 0xa2, 0xa2, 0xb3, 0xa3, 0xa3, 0xb4, 1230 0xa0, 0xa0, 0xa0, 0x90, 0xa1, 0xa1, 0xa1, 0xb2, 0x91, 0x91, 0xa2, 0xa2, 0xb3, 0xa3, 0xa3, 0xb4, 1231 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0xa5, 0x84, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0x96, 0xa7, 0xb8, 1232 0xa4, 0xa4, 0xa4, 0x94, 0x94, 0xa5, 0xa5, 0x84, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0x96, 0xa7, 0xb8, 1233 0xa4, 0xa4, 0xa4, 0x94, 0xa5, 0xa5, 0xa5, 0xb6, 0x95, 0xa6, 0xa6, 0xa6, 0xb7, 0xa7, 0xa7, 0xb8, 1234 0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xb6, 0xb6, 0x95, 0xa6, 0xa6, 0xb7, 0xb7, 0xa7, 0xb8, 0xb8, 1235 0xb5, 0xb5, 0xb5, 0x87, 0x87, 0xb6, 0xb6, 0xb6, 0x88, 0x99, 0xa6, 0xb7, 0xb7, 0x9a, 0xb8, 0xb8, 1236 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, 0x88, 0x99, 0x99, 0x99, 0x89, 0x9a, 0x9a, 0xab, 0xab, 1237 0x97, 0x97, 0x97, 0x98, 0x98, 0xa9, 0xa9, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0x9a, 0xab, 0xab, 0xbc, 1238 0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0x99, 0xaa, 0xaa, 0xaa, 0xbb, 0xab, 0xab, 0xbc, 1239 0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xba, 0xba, 0x8c, 0xaa, 0xaa, 0xbb, 0xbb, 0xab, 0xbc, 0xbc, 1240 0xb9, 0xb9, 0xb9, 0x9c, 0x9c, 0xba, 0xba, 0xba, 0x9d, 0x9d, 0xbb, 0xbb, 0xbb, 0x9e, 0x9e, 0xbc, 1241 0xac, 0xac, 0xac, 0x9c, 0x9c, 0xad, 0xad, 0x9d, 0x9d, 0xae, 0xae, 0xae, 0x9e, 0x9e, 0xaf, 0xaf, 1242 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xbe, 0xbe, 0xae, 0xae, 0xae, 0xbf, 0x9e, 0xaf, 0xaf, 0xb0, 1243 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xae, 0xbf, 0xbf, 0xbf, 0xbf, 0xaf, 0xb0, 0xb0, 1244 0xb1, 0xb1, 0xb1, 0xce, 0xce, 0xb2, 0xb2, 0xcf, 0xcf, 0xa2, 0xa2, 0xb3, 0xb3, 0xc0, 0xb4, 0xb4, 1245 0xb1, 0xb1, 0xb1, 0xce, 0xce, 0xb2, 0xb2, 0xcf, 0xcf, 0xa2, 0xa2, 0xb3, 0xb3, 0xc0, 0xb4, 0xb4, 1246 0xb1, 0xb1, 0xb1, 0xc2, 0xc2, 0xb2, 0xb2, 0xc3, 0xc3, 0xa2, 0xa2, 0xb3, 0xb3, 0xc0, 0xb4, 0xb4, 1247 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xa5, 0xc3, 0xc3, 0xc3, 0xa6, 0xc4, 0xc4, 0xc4, 0xa7, 0xb8, 1248 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xa5, 0xb6, 0xc3, 0xc3, 0xc3, 0xa6, 0xc4, 0xc4, 0xc4, 0xb8, 0xb8, 1249 0xb5, 0xb5, 0xb5, 0xc2, 0xa5, 0xb6, 0xb6, 0xb6, 0xc3, 0xa6, 0xa6, 0xb7, 0xb7, 0xc4, 0xb8, 0xb8, 1250 0xb5, 0xb5, 0xb5, 0xa5, 0xb6, 0xb6, 0xb6, 0xb6, 0xc3, 0xa6, 0xb7, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 1251 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xb6, 0xb6, 0xc7, 0xc7, 0xc7, 0xb7, 0xb7, 0xc8, 0xc8, 0xb8, 0xb8, 1252 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xaa, 0xc8, 0xc8, 0xc8, 0xab, 0xbc, 1253 0xa8, 0xa8, 0xa8, 0xc6, 0xc6, 0xa9, 0xa9, 0xc7, 0xc7, 0xaa, 0xaa, 0xaa, 0xc8, 0xc8, 0xab, 0xbc, 1254 0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xba, 0xba, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xab, 0xbc, 0xbc, 1255 0xb9, 0xb9, 0xb9, 0xca, 0xca, 0xba, 0xba, 0xba, 0xcb, 0xaa, 0xbb, 0xbb, 0xbb, 0xcc, 0xbc, 0xbc, 1256 0xb9, 0xb9, 0xb9, 0xca, 0xca, 0xba, 0xba, 0xcb, 0xcb, 0xcb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xbc, 1257 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xba, 0xcb, 0xcb, 0xcb, 0xae, 0xcc, 0xcc, 0xcc, 0xaf, 0xaf, 1258 0xbd, 0xbd, 0xbd, 0xad, 0xbe, 0xbe, 0xbe, 0xbe, 0xae, 0xae, 0xbf, 0xbf, 0xcc, 0xaf, 0xaf, 0xb0, 1259 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xaf, 0xb0, 0xb0, 1260 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xb2, 0xcf, 0xcf, 0xcf, 0xb3, 0xb3, 0xc0, 0xc0, 0xd1, 0xb4, 1261 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xb2, 0xcf, 0xcf, 0xcf, 0xb3, 0xb3, 0xc0, 0xc0, 0xd1, 0xb4, 1262 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xb2, 0xc3, 0xc3, 0xc3, 0xb3, 0xb3, 0xc0, 0xc0, 0xd1, 0xb4, 1263 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xd4, 0xc4, 0xc4, 0xc4, 0xd5, 0xd5, 1264 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xb6, 0xc3, 0xc3, 0xc3, 0xd4, 0xc4, 0xc4, 0xc4, 0xd5, 0xb8, 1265 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xb6, 0xb6, 0xc3, 0xc3, 0xd4, 0xb7, 0xb7, 0xc4, 0xd5, 0xd5, 0xb8, 1266 0xb5, 0xb5, 0xb5, 0xc2, 0xb6, 0xb6, 0xb6, 0xb6, 0xc3, 0xd4, 0xb7, 0xb7, 0xb7, 0xd5, 0xd5, 0xb8, 1267 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xb6, 0xc7, 0xc7, 0xc7, 0xb7, 0xc8, 0xc8, 0xc8, 0xd9, 0xd9, 1268 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xd8, 0xc8, 0xc8, 0xc8, 0xd9, 0xd9, 1269 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xd7, 0xd7, 0xc7, 0xc7, 0xd8, 0xd8, 0xc8, 0xc8, 0xd9, 0xd9, 0xbc, 1270 0xb9, 0xb9, 0xb9, 0xd7, 0xd7, 0xba, 0xba, 0xba, 0xd8, 0xd8, 0xbb, 0xbb, 0xbb, 0xd9, 0xd9, 0xbc, 1271 0xb9, 0xb9, 0xb9, 0xca, 0xca, 0xba, 0xba, 0xcb, 0xcb, 0xcb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xbc, 1272 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xba, 0xcb, 0xcb, 0xcb, 0xbb, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 1273 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xdb, 0xdb, 0xcb, 0xcb, 0xdc, 0xdc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 1274 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xcc, 0xdd, 0xdd, 0xdd, 0xb0, 1275 0xbd, 0xbd, 0xbd, 0xdb, 0xbe, 0xbe, 0xbe, 0xdc, 0xdc, 0xbf, 0xbf, 0xbf, 0xdd, 0xdd, 0xb0, 0xb0, 1276 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xcf, 0xd0, 0xd0, 0xe1, 0xc0, 0xc0, 0xd1, 0xd1, 0xe2, 1277 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xcf, 0xd0, 0xd0, 0xe1, 0xc0, 0xc0, 0xd1, 0xd1, 0xe2, 1278 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xc3, 0xd0, 0xd0, 0xe1, 0xc0, 0xc0, 0xd1, 0xd1, 0xe2, 1279 0xd2, 0xd2, 0xd2, 0xc2, 0xd3, 0xd3, 0xd3, 0xc3, 0xc3, 0xd4, 0xd4, 0xc4, 0xc4, 0xd5, 0xd5, 0xe6, 1280 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd3, 0xc3, 0xd4, 0xd4, 0xd4, 0xc4, 0xc4, 0xd5, 0xd5, 0xe6, 1281 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xe4, 0xc3, 0xd4, 0xd4, 0xe5, 0xc4, 0xd5, 0xd5, 0xe6, 0xe6, 1282 0xe3, 0xe3, 0xe3, 0xd3, 0xd3, 0xe4, 0xb6, 0xd4, 0xd4, 0xe5, 0xe5, 0xb7, 0xd5, 0xd5, 0xe6, 0xe6, 1283 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xd7, 0xc7, 0xc7, 0xd8, 0xd8, 0xc8, 0xc8, 0xd9, 0xd9, 0xd9, 1284 0xd6, 0xd6, 0xd6, 0xc6, 0xd7, 0xd7, 0xd7, 0xc7, 0xd8, 0xd8, 0xd8, 0xc8, 0xc8, 0xd9, 0xd9, 0xea, 1285 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xe8, 0xd8, 0xd8, 0xd8, 0xe9, 0xc8, 0xd9, 0xd9, 0xea, 0xea, 1286 0xe7, 0xe7, 0xe7, 0xd7, 0xd7, 0xe8, 0xe8, 0xd8, 0xd8, 0xe9, 0xe9, 0xe9, 0xd9, 0xd9, 0xea, 0xea, 1287 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xba, 0xcb, 0xcb, 0xcb, 0xe9, 0xcc, 0xcc, 0xcc, 0xea, 0xea, 1288 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xdb, 0xdb, 0xcb, 0xcb, 0xdc, 0xdc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 1289 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xcc, 0xdd, 0xdd, 0xdd, 0xee, 1290 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xec, 0xec, 0xdc, 0xdc, 0xed, 0xed, 0xed, 0xdd, 0xdd, 0xee, 0xee, 1291 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xdc, 0xed, 0xed, 0xed, 0xed, 0xdd, 0xee, 0xee, 0xee, 1292 0xef, 0xef, 0xef, 0xdf, 0xe0, 0xe0, 0xe0, 0xd0, 0xd0, 0xe1, 0xe1, 0xf2, 0xd1, 0xd1, 0xe2, 0xe2, 1293 0xef, 0xef, 0xef, 0xdf, 0xe0, 0xe0, 0xe0, 0xd0, 0xd0, 0xe1, 0xe1, 0xf2, 0xd1, 0xd1, 0xe2, 0xe2, 1294 0xef, 0xef, 0xef, 0xdf, 0xe0, 0xe0, 0xe0, 0xd0, 0xd0, 0xe1, 0xe1, 0xf2, 0xd1, 0xd1, 0xe2, 0xe2, 1295 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xe4, 0xe4, 0xd4, 0xd4, 0xd4, 0xe5, 0xe5, 0xd5, 0xd5, 0xe6, 0xe6, 1296 0xe3, 0xe3, 0xe3, 0xd3, 0xe4, 0xe4, 0xe4, 0xd4, 0xd4, 0xe5, 0xe5, 0xf6, 0xd5, 0xd5, 0xe6, 0xe6, 1297 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, 0xd4, 0xe5, 0xe5, 0xe5, 0xf6, 0xd5, 0xe6, 0xe6, 0xf7, 1298 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xf5, 0xf5, 0xe5, 0xe5, 0xf6, 0xf6, 0xd5, 0xe6, 0xe6, 0xf7, 1299 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xf5, 0xc7, 0xd8, 0xd8, 0xf6, 0xc8, 0xd9, 0xd9, 0xd9, 0xf7, 1300 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xe8, 0xe8, 0xd8, 0xd8, 0xd8, 0xe9, 0xe9, 0xd9, 0xd9, 0xea, 0xea, 1301 0xe7, 0xe7, 0xe7, 0xd7, 0xe8, 0xe8, 0xe8, 0xd8, 0xd8, 0xe9, 0xe9, 0xe9, 0xd9, 0xea, 0xea, 0xea, 1302 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xf9, 0xf9, 0xe9, 0xe9, 0xe9, 0xfa, 0xd9, 0xea, 0xea, 0xfb, 1303 0xf8, 0xf8, 0xf8, 0xe8, 0xf9, 0xf9, 0xf9, 0xcb, 0xe9, 0xe9, 0xfa, 0xfa, 0xcc, 0xea, 0xea, 0xfb, 1304 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xcc, 0xdd, 0xdd, 0xdd, 0xee, 1305 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xec, 0xec, 0xdc, 0xdc, 0xed, 0xed, 0xed, 0xdd, 0xdd, 0xee, 0xee, 1306 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xdc, 0xed, 0xed, 0xed, 0xed, 0xdd, 0xee, 0xee, 0xee, 1307 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xfe, 0xfe, 0xee, 0xee, 0xee, 0xff, 1308 0xf0, 0xf0, 0xf0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1, 0xe1, 0xf2, 0xf2, 0xf2, 0xf2, 0xe2, 0xe2, 0xf3, 1309 0xf0, 0xf0, 0xf0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1, 0xe1, 0xf2, 0xf2, 0xf2, 0xf2, 0xe2, 0xe2, 0xf3, 1310 0xf0, 0xf0, 0xf0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1, 0xe1, 0xf2, 0xf2, 0xf2, 0xf2, 0xe2, 0xe2, 0xf3, 1311 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xf5, 0xf5, 0xe5, 0xe5, 0xf6, 0xf6, 0xd5, 0xe6, 0xe6, 0xf7, 1312 0xf4, 0xf4, 0xf4, 0xe4, 0xe4, 0xf5, 0xf5, 0xf5, 0xe5, 0xe5, 0xf6, 0xf6, 0xf6, 0xe6, 0xe6, 0xf7, 1313 0xf4, 0xf4, 0xf4, 0xe4, 0xf5, 0xf5, 0xf5, 0xf5, 0xe5, 0xf6, 0xf6, 0xf6, 0xf6, 0xe6, 0xf7, 0xf7, 1314 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xe5, 0xf6, 0xf6, 0xf6, 0xf6, 0xe6, 0xf7, 0xf7, 1315 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xd8, 0xf6, 0xf6, 0xf6, 0xd9, 0xd9, 0xf7, 0xf7, 1316 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xd8, 0xe9, 0xe9, 0xe9, 0xfa, 0xd9, 0xea, 0xea, 0xea, 1317 0xf8, 0xf8, 0xf8, 0xe8, 0xe8, 0xf9, 0xf9, 0xf9, 0xe9, 0xe9, 0xfa, 0xfa, 0xfa, 0xea, 0xea, 0xfb, 1318 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xe9, 0xfa, 0xfa, 0xfa, 0xfa, 0xea, 0xfb, 0xfb, 1319 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xea, 0xfb, 0xfb, 1320 0xf8, 0xf8, 0xf8, 0xdb, 0xf9, 0xf9, 0xf9, 0xdc, 0xdc, 0xfa, 0xfa, 0xfa, 0xdd, 0xdd, 0xee, 0xfb, 1321 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xdc, 0xed, 0xed, 0xed, 0xed, 0xdd, 0xee, 0xee, 0xee, 1322 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xfe, 0xfe, 0xee, 0xee, 0xee, 0xff, 1323 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xed, 0xfe, 0xfe, 0xfe, 0xfe, 0xee, 0xff, 0xff, 1324 }