Files
crosspoint-reader-mod/lib/EpdFont/builtinFonts/bookerly_14_regular.h

2510 lines
196 KiB
C
Raw Normal View History

/**
* generated by fontconvert.py
* name: bookerly_14_regular
* size: 14
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
* mode: 2-bit compressed: true
fix: force auto-hinting for Bookerly to fix inconsistent stem widths (#1098) ## Summary Bookerly's native TrueType hinting is effectively a no-op at the sizes used here, causing FreeType to place stems at inconsistent sub-pixel positions. This results in the 'k' stem (8-bit fringe: 0x38=56) falling just below the 2-bit quantization threshold while 'l' and 'h' stems (fringes: 0x4C=76, 0x40=64) land above it --- making 'k' visibly narrower (2.00px vs 2.33px effective width). FreeType's auto-hinter snaps all stems to consistent grid positions, normalizing effective stem width to 2.67px across all glyphs. Adds --force-autohint flag to fontconvert.py and applies it to Bookerly only. NotoSans, OpenDyslexic, and Ubuntu fonts are unaffected. Here is an example of before/after. Take notice of the vertical stems on characters like `l`, `k`, `n`, `i`, etc. The font is Bookerly 12pt regular: **BEFORE**: ![before](https://github.com/user-attachments/assets/65b2acab-ad95-489e-885e-e3a0163cc252) **AFTER**: ![after](https://github.com/user-attachments/assets/d09a8b5d-40af-4a7d-b622-e1b2cabcce85) Claude generated this script to quantitatively determine that this change makes the vertical stems on a variety of characters more consistent for Bookerly _only_. <details> <summary>Python script</summary> ```python #!/usr/bin/env python3 """Compare stem consistency across all font families with and without auto-hinting. Run from repo root: python3 compare_all_fonts.py """ import freetype DPI = 150 CHARS = ["k", "l", "h", "i", "b", "d"] SIZES = [12, 14, 16, 18] FONTS = { "Bookerly": "lib/EpdFont/builtinFonts/source/Bookerly/Bookerly-Regular.ttf", "NotoSans": "lib/EpdFont/builtinFonts/source/NotoSans/NotoSans-Regular.ttf", "OpenDyslexic": "lib/EpdFont/builtinFonts/source/OpenDyslexic/OpenDyslexic-Regular.otf", "Ubuntu": "lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Regular.ttf", } MODES = { "default": freetype.FT_LOAD_RENDER, "autohint": freetype.FT_LOAD_RENDER | freetype.FT_LOAD_FORCE_AUTOHINT, } def q4to2(v): if v >= 12: return 3 elif v >= 8: return 2 elif v >= 4: return 1 else: return 0 def get_stem_eff(face, char, flags): gi = face.get_char_index(ord(char)) if gi == 0: return None face.load_glyph(gi, flags) bm = face.glyph.bitmap w, h = bm.width, bm.rows if w == 0 or h == 0: return None p2 = [] for y in range(h): row = [] for x in range(w): row.append(q4to2(bm.buffer[y * bm.pitch + x] >> 4)) p2.append(row) # Measure leftmost stem in stable middle rows mid_start, mid_end = h // 4, h - h // 4 widths = [] for y in range(mid_start, mid_end): first = next((x for x in range(w) if p2[y][x] > 0), -1) if first < 0: continue last = first for x in range(first, w): if p2[y][x] > 0: last = x else: break eff = sum(p2[y][x] for x in range(first, last + 1)) / 3.0 widths.append(eff) return round(sum(widths) / len(widths), 2) if widths else None def main(): for font_name, font_path in FONTS.items(): try: freetype.Face(font_path) except Exception: print(f"\n {font_name}: SKIPPED (file not found)") continue print(f"\n{'=' * 80}") print(f" {font_name}") print(f"{'=' * 80}") for size in SIZES: print(f"\n {size}pt:") print(f" {'':6s}", end="") for c in CHARS: print(f" '{c}' ", end="") print(" | spread") for mode_name, flags in MODES.items(): face = freetype.Face(font_path) face.set_char_size(size << 6, size << 6, DPI, DPI) vals = [] print(f" {mode_name:6s}", end="") for c in CHARS: v = get_stem_eff(face, c, flags) vals.append(v) print(f" {v:5.2f}" if v else " N/A", end="") valid = [v for v in vals if v is not None] spread = max(valid) - min(valid) if len(valid) >= 2 else 0 marker = " <-- inconsistent" if spread > 0.5 else "" print(f" | {spread:.2f}{marker}") if __name__ == "__main__": main() ``` </details> Here are the results. The table compares how the font-generation `autohint` flag affects the range of widths of various characters. Lower `spread` mean that glyph stroke widths should appear more consistent. ``` Spread = max stem width - min stem width across glyphs (lower = more consistent): ┌──────────────┬──────┬─────────┬──────────┬──────────┐ │ Font │ Size │ Default │ Autohint │ Winner │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Bookerly │ 12pt │ 1.49 │ 1.12 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.39 │ 1.13 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.38 │ 1.16 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.90 │ 1.58 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ NotoSans │ 12pt │ 1.16 │ 0.94 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 0.83 │ 1.14 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.41 │ 1.51 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.74 │ 1.63 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ OpenDyslexic │ 12pt │ 2.22 │ 1.44 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 2.57 │ 3.29 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 3.13 │ 2.60 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 3.21 │ 3.23 │ ~tied │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Ubuntu │ 12pt │ 1.25 │ 1.31 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.41 │ 1.64 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 2.21 │ 1.71 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.80 │ 1.71 │ autohint │ └──────────────┴──────┴─────────┴──────────┴──────────┘ ``` --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? I used AI to make sure I'm not doing something stupid, since I'm not a typography expert. I made the changes though.
2026-02-24 06:13:08 +11:00
* Command used: fontconvert.py bookerly_14_regular 14 ../builtinFonts/source/Bookerly/Bookerly-Regular.ttf --2bit --compress --force-autohint
*/
#pragma once
#include "EpdFontData.h"
fix: force auto-hinting for Bookerly to fix inconsistent stem widths (#1098) ## Summary Bookerly's native TrueType hinting is effectively a no-op at the sizes used here, causing FreeType to place stems at inconsistent sub-pixel positions. This results in the 'k' stem (8-bit fringe: 0x38=56) falling just below the 2-bit quantization threshold while 'l' and 'h' stems (fringes: 0x4C=76, 0x40=64) land above it --- making 'k' visibly narrower (2.00px vs 2.33px effective width). FreeType's auto-hinter snaps all stems to consistent grid positions, normalizing effective stem width to 2.67px across all glyphs. Adds --force-autohint flag to fontconvert.py and applies it to Bookerly only. NotoSans, OpenDyslexic, and Ubuntu fonts are unaffected. Here is an example of before/after. Take notice of the vertical stems on characters like `l`, `k`, `n`, `i`, etc. The font is Bookerly 12pt regular: **BEFORE**: ![before](https://github.com/user-attachments/assets/65b2acab-ad95-489e-885e-e3a0163cc252) **AFTER**: ![after](https://github.com/user-attachments/assets/d09a8b5d-40af-4a7d-b622-e1b2cabcce85) Claude generated this script to quantitatively determine that this change makes the vertical stems on a variety of characters more consistent for Bookerly _only_. <details> <summary>Python script</summary> ```python #!/usr/bin/env python3 """Compare stem consistency across all font families with and without auto-hinting. Run from repo root: python3 compare_all_fonts.py """ import freetype DPI = 150 CHARS = ["k", "l", "h", "i", "b", "d"] SIZES = [12, 14, 16, 18] FONTS = { "Bookerly": "lib/EpdFont/builtinFonts/source/Bookerly/Bookerly-Regular.ttf", "NotoSans": "lib/EpdFont/builtinFonts/source/NotoSans/NotoSans-Regular.ttf", "OpenDyslexic": "lib/EpdFont/builtinFonts/source/OpenDyslexic/OpenDyslexic-Regular.otf", "Ubuntu": "lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Regular.ttf", } MODES = { "default": freetype.FT_LOAD_RENDER, "autohint": freetype.FT_LOAD_RENDER | freetype.FT_LOAD_FORCE_AUTOHINT, } def q4to2(v): if v >= 12: return 3 elif v >= 8: return 2 elif v >= 4: return 1 else: return 0 def get_stem_eff(face, char, flags): gi = face.get_char_index(ord(char)) if gi == 0: return None face.load_glyph(gi, flags) bm = face.glyph.bitmap w, h = bm.width, bm.rows if w == 0 or h == 0: return None p2 = [] for y in range(h): row = [] for x in range(w): row.append(q4to2(bm.buffer[y * bm.pitch + x] >> 4)) p2.append(row) # Measure leftmost stem in stable middle rows mid_start, mid_end = h // 4, h - h // 4 widths = [] for y in range(mid_start, mid_end): first = next((x for x in range(w) if p2[y][x] > 0), -1) if first < 0: continue last = first for x in range(first, w): if p2[y][x] > 0: last = x else: break eff = sum(p2[y][x] for x in range(first, last + 1)) / 3.0 widths.append(eff) return round(sum(widths) / len(widths), 2) if widths else None def main(): for font_name, font_path in FONTS.items(): try: freetype.Face(font_path) except Exception: print(f"\n {font_name}: SKIPPED (file not found)") continue print(f"\n{'=' * 80}") print(f" {font_name}") print(f"{'=' * 80}") for size in SIZES: print(f"\n {size}pt:") print(f" {'':6s}", end="") for c in CHARS: print(f" '{c}' ", end="") print(" | spread") for mode_name, flags in MODES.items(): face = freetype.Face(font_path) face.set_char_size(size << 6, size << 6, DPI, DPI) vals = [] print(f" {mode_name:6s}", end="") for c in CHARS: v = get_stem_eff(face, c, flags) vals.append(v) print(f" {v:5.2f}" if v else " N/A", end="") valid = [v for v in vals if v is not None] spread = max(valid) - min(valid) if len(valid) >= 2 else 0 marker = " <-- inconsistent" if spread > 0.5 else "" print(f" | {spread:.2f}{marker}") if __name__ == "__main__": main() ``` </details> Here are the results. The table compares how the font-generation `autohint` flag affects the range of widths of various characters. Lower `spread` mean that glyph stroke widths should appear more consistent. ``` Spread = max stem width - min stem width across glyphs (lower = more consistent): ┌──────────────┬──────┬─────────┬──────────┬──────────┐ │ Font │ Size │ Default │ Autohint │ Winner │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Bookerly │ 12pt │ 1.49 │ 1.12 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.39 │ 1.13 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.38 │ 1.16 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.90 │ 1.58 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ NotoSans │ 12pt │ 1.16 │ 0.94 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 0.83 │ 1.14 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.41 │ 1.51 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.74 │ 1.63 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ OpenDyslexic │ 12pt │ 2.22 │ 1.44 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 2.57 │ 3.29 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 3.13 │ 2.60 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 3.21 │ 3.23 │ ~tied │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Ubuntu │ 12pt │ 1.25 │ 1.31 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.41 │ 1.64 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 2.21 │ 1.71 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.80 │ 1.71 │ autohint │ └──────────────┴──────┴─────────┴──────────┴──────────┘ ``` --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? I used AI to make sure I'm not doing something stupid, since I'm not a typography expert. I made the changes though.
2026-02-24 06:13:08 +11:00
static const uint8_t bookerly_14_regularBitmaps[26436] = {
0xA5, 0x59, 0x3D, 0x8C, 0xDD, 0xD6, 0x95, 0x3E, 0x24, 0xA5, 0x61, 0x62, 0x66, 0x71, 0x8D, 0x20,
0xB3, 0x6B, 0x44, 0x90, 0x99, 0x62, 0x8B, 0x20, 0x51, 0x44, 0xA7, 0x73, 0x31, 0x33, 0x97, 0x8E,
0x0A, 0x17, 0x29, 0xAC, 0xC2, 0xCF, 0x2A, 0x54, 0x28, 0xFD, 0x16, 0xD3, 0x6C, 0x91, 0x00, 0x33,
0x22, 0xD7, 0x2E, 0xD3, 0xB8, 0x71, 0x9A, 0x20, 0x48, 0x9A, 0x14, 0x01, 0x02, 0x38, 0x85, 0x80,
0xD8, 0xC0, 0xBC, 0x21, 0x6D, 0x15, 0x06, 0xE2, 0x42, 0x0C, 0x16, 0xB3, 0x29, 0x52, 0x88, 0xBB,
0x2B, 0xC1, 0x8B, 0x6C, 0xA1, 0x6B, 0x89, 0xB3, 0xE6, 0x44, 0x24, 0xEF, 0x7E, 0xDF, 0xE1, 0x1B,
0x79, 0x46, 0x91, 0x6C, 0x27, 0x79, 0xF3, 0xC8, 0x47, 0x5E, 0x5E, 0xDE, 0x7B, 0xEE, 0xF9, 0xF9,
0xCE, 0x77, 0xEE, 0x6C, 0xED, 0x8F, 0xE3, 0xF0, 0xE8, 0xB3, 0xB7, 0xF7, 0xAC, 0xC8, 0xAE, 0xF7,
0xBB, 0x3B, 0xA9, 0x35, 0xB7, 0x6E, 0x3E, 0x70, 0xC3, 0x60, 0x57, 0x17, 0xFD, 0x96, 0xE0, 0x13,
0x94, 0xCF, 0x89, 0x6C, 0x44, 0xB5, 0xC4, 0xE5, 0x8B, 0x22, 0x37, 0xE2, 0x5C, 0x8C, 0xDC, 0x90,
0xCA, 0xFB, 0xD1, 0x78, 0xEF, 0x9B, 0xA0, 0x79, 0x5E, 0xE4, 0x42, 0xD8, 0x48, 0x54, 0x6F, 0x88,
0xBC, 0x18, 0xD5, 0xC1, 0xD5, 0xB7, 0xDE, 0xBD, 0x6C, 0xF1, 0x28, 0xC6, 0xE1, 0xC4, 0x19, 0x91,
0xE7, 0xA5, 0x95, 0xB0, 0x39, 0x8F, 0x61, 0xC2, 0x5A, 0x82, 0xFC, 0x39, 0x99, 0x3F, 0x18, 0x2E,
0x2A, 0x8F, 0x7F, 0xD6, 0x7C, 0x19, 0x79, 0x9F, 0x8F, 0xDF, 0x1D, 0xB2, 0x4B, 0xC9, 0x4D, 0xF7,
0xC2, 0x8E, 0x8D, 0x82, 0xA8, 0x7F, 0x41, 0xB2, 0x8F, 0x44, 0x30, 0x4C, 0xE8, 0x31, 0x84, 0x6F,
0xE4, 0x1F, 0x7C, 0x2E, 0xEF, 0x0F, 0x2F, 0x7C, 0xC5, 0x7C, 0x98, 0xD7, 0x43, 0xFF, 0x15, 0x73,
0xAB, 0x79, 0xBF, 0xAB, 0x7E, 0x36, 0x85, 0xDE, 0x97, 0xE1, 0x7E, 0x0E, 0x21, 0x30, 0x89, 0x9C,
0xFC, 0x79, 0x76, 0x9E, 0xEB, 0x9F, 0x45, 0x32, 0xCA, 0x28, 0xC6, 0x97, 0xD2, 0x49, 0x74, 0x38,
0x48, 0x2A, 0x72, 0x3D, 0x69, 0xA3, 0x46, 0x92, 0xC6, 0xCA, 0x0F, 0x45, 0x86, 0x88, 0xB2, 0x9A,
0xDA, 0x62, 0x31, 0xBC, 0xD9, 0xD0, 0x9B, 0x24, 0x9C, 0xF2, 0x65, 0xFC, 0xFB, 0xD6, 0x8F, 0xB1,
0x1B, 0x36, 0xEC, 0x4F, 0x9D, 0xF5, 0xDF, 0x7F, 0xB9, 0xCD, 0xCA, 0xAA, 0x71, 0x4B, 0x19, 0x24,
0xBF, 0x60, 0x6A, 0x43, 0xDD, 0x0C, 0xB8, 0xC1, 0x62, 0x79, 0x73, 0x51, 0x86, 0xA0, 0xC7, 0x5C,
0x49, 0x9B, 0xE5, 0x98, 0x0B, 0xEF, 0x60, 0xAE, 0xD0, 0x0F, 0x82, 0xB9, 0xD6, 0x26, 0x91, 0xE3,
0xF5, 0xAB, 0x68, 0x55, 0x87, 0x53, 0x81, 0x95, 0x89, 0x69, 0x2A, 0x91, 0xB0, 0x8B, 0x9C, 0x88,
0xC5, 0x9F, 0x44, 0x2E, 0x6A, 0x79, 0xB9, 0x87, 0xCB, 0x2E, 0x43, 0xAF, 0xF4, 0x75, 0x68, 0x2B,
0x1C, 0x64, 0xFD, 0xB2, 0x54, 0x6D, 0xE2, 0xEB, 0xAC, 0xCA, 0xAB, 0x21, 0xFA, 0x78, 0x10, 0x27,
0xCB, 0x04, 0xB2, 0x43, 0xDA, 0xDA, 0x41, 0x0C, 0xCF, 0xCB, 0x68, 0x74, 0xB2, 0x2F, 0xC9, 0x28,
0x71, 0x27, 0x69, 0x27, 0xD9, 0xDD, 0xAB, 0xFE, 0x08, 0x56, 0x1B, 0xED, 0x20, 0xD5, 0x91, 0x6C,
0xE7, 0x3B, 0x2B, 0xFB, 0xF7, 0x6A, 0xE3, 0x3A, 0xE8, 0x82, 0x4E, 0x7A, 0xCC, 0xB5, 0x8B, 0x19,
0xD3, 0x1C, 0xEF, 0xB7, 0x68, 0x58, 0xE2, 0x06, 0x97, 0x1C, 0x14, 0x17, 0x4D, 0xD8, 0xC9, 0x75,
0xDC, 0xE3, 0xA7, 0xC0, 0x5D, 0x30, 0x48, 0x56, 0x47, 0xBD, 0xD8, 0x92, 0x0A, 0x83, 0x90, 0x39,
0x26, 0x0C, 0x7B, 0x3C, 0x41, 0x67, 0x88, 0x89, 0xDF, 0xEB, 0x58, 0x84, 0x64, 0x39, 0xB4, 0x91,
0xD6, 0x18, 0xC3, 0x7C, 0x7A, 0x2A, 0x31, 0x7A, 0xC6, 0xA7, 0xBB, 0x68, 0xC0, 0xB5, 0x95, 0x84,
0x3F, 0x5B, 0x1C, 0x85, 0x9F, 0xE7, 0xE5, 0x3D, 0x67, 0xCF, 0x87, 0x53, 0x1D, 0x78, 0x97, 0xF9,
0xEC, 0xD7, 0x5F, 0xBD, 0x5F, 0x7F, 0xE9, 0xA2, 0x04, 0x0D, 0xCD, 0x7A, 0xE2, 0xBB, 0xD8, 0x5D,
0x78, 0xFD, 0x3C, 0xD6, 0x1E, 0x37, 0x55, 0xEC, 0xAE, 0x27, 0xCD, 0x90, 0x46, 0xED, 0x0F, 0x65,
0x7D, 0x61, 0xFD, 0x6D, 0xDF, 0xD1, 0xCB, 0x85, 0x66, 0x37, 0xA5, 0xC4, 0xB5, 0x84, 0x50, 0x34,
0x94, 0x0F, 0xF5, 0x6E, 0x1D, 0xB7, 0x46, 0x8F, 0x5A, 0x77, 0x4E, 0xB6, 0x36, 0x7F, 0xD1, 0x9A,
0xC0, 0xB3, 0x24, 0xEB, 0x25, 0x80, 0xCB, 0x26, 0x87, 0x05, 0xAC, 0x9E, 0x38, 0x8B, 0xE5, 0x60,
0xE1, 0xFD, 0xAE, 0x04, 0xFD, 0x12, 0x1E, 0x34, 0x3C, 0xF1, 0xE0, 0xB3, 0xA0, 0xBB, 0xAE, 0x7D,
0x23, 0x97, 0x95, 0xA6, 0x31, 0x87, 0x45, 0x19, 0x7B, 0xF8, 0x45, 0x05, 0x73, 0xAF, 0xC1, 0x19,
0x24, 0xF3, 0xF0, 0x08, 0xF9, 0xC7, 0x8A, 0xD6, 0xFF, 0x42, 0xDF, 0x22, 0x4F, 0x61, 0x59, 0x3F,
0x72, 0x88, 0xCA, 0x37, 0xF6, 0xC0, 0x27, 0x2E, 0xEC, 0x47, 0x31, 0xB7, 0xA0, 0xEC, 0x1D, 0xAA,
0x1C, 0x26, 0x80, 0x21, 0x24, 0xC6, 0x3A, 0x46, 0xBC, 0x52, 0x4A, 0xE2, 0x68, 0x23, 0xC1, 0x1C,
0x59, 0x7D, 0x7C, 0x53, 0x2C, 0x16, 0x2F, 0x7B, 0x0E, 0xE4, 0x6B, 0xD9, 0xEE, 0x21, 0x83, 0x4B,
0xEF, 0x56, 0x6F, 0xB8, 0x60, 0xB8, 0x80, 0x21, 0x72, 0x3A, 0x78, 0x56, 0x72, 0x88, 0x78, 0x90,
0x04, 0x61, 0x84, 0xB5, 0x9F, 0x0D, 0x31, 0x5A, 0xA2, 0x1E, 0x4B, 0x63, 0xC2, 0xE0, 0x92, 0x22,
0xA0, 0xFA, 0xF5, 0xED, 0x89, 0xD1, 0x6C, 0x26, 0xB5, 0x66, 0xAE, 0x93, 0x48, 0x81, 0x03, 0x23,
0x47, 0x38, 0xE2, 0xDB, 0xB5, 0x0A, 0x67, 0x21, 0xDA, 0x12, 0x0E, 0xD0, 0xD3, 0xCB, 0xA0, 0xC4,
0xC6, 0xD4, 0x69, 0x09, 0x3F, 0xA6, 0x2F, 0xC3, 0xAA, 0x3C, 0xCE, 0x2E, 0xAE, 0x1D, 0x30, 0x12,
0x1F, 0x3F, 0x30, 0x7E, 0x63, 0xFD, 0x10, 0x1D, 0x2E, 0x72, 0xD8, 0x84, 0xA1, 0xB2, 0x29, 0x12,
0xDF, 0xC1, 0x34, 0xF0, 0x79, 0x04, 0xDB, 0xB7, 0x80, 0x1A, 0x52, 0x95, 0xBA, 0x30, 0xBE, 0x31,
0xFF, 0xC0, 0x3F, 0xA1, 0x60, 0xC9, 0xDA, 0xF5, 0xB7, 0xFB, 0x18, 0x0A, 0xCB, 0x8E, 0x34, 0x08,
0x6B, 0xE8, 0xBC, 0x8E, 0xFD, 0x2F, 0xA5, 0x00, 0x48, 0xF4, 0xAA, 0xA0, 0x80, 0x2F, 0xBC, 0xC7,
0xD8, 0xEC, 0x81, 0x2E, 0x83, 0x69, 0xE2, 0x01, 0x16, 0xEB, 0x06, 0x89, 0x1F, 0xB8, 0x59, 0x76,
0xE8, 0x73, 0x28, 0x24, 0x6E, 0x27, 0xB1, 0x81, 0xBF, 0xD2, 0xC3, 0x17, 0xCA, 0xD9, 0x00, 0x70,
0x36, 0x3F, 0x8E, 0x8B, 0x6B, 0xB7, 0xF2, 0xB0, 0x77, 0x62, 0x9F, 0x01, 0xC2, 0x88, 0xF4, 0xAA,
0xA4, 0xB8, 0x55, 0x49, 0xD2, 0x52, 0xD5, 0x05, 0xC1, 0xF9, 0x68, 0x6E, 0x40, 0x58, 0x1D, 0xAB,
0x11, 0x3F, 0x41, 0x4B, 0x5C, 0xB8, 0x23, 0xD6, 0xB7, 0xE6, 0x6E, 0xF5, 0xBD, 0x3E, 0xC4, 0xEC,
0xE6, 0x26, 0x22, 0xD1, 0xE6, 0xE9, 0xBF, 0x8D, 0x91, 0x4B, 0x8E, 0x80, 0x60, 0x13, 0x1C, 0xB0,
0x97, 0x65, 0xEA, 0xB2, 0x3C, 0xFB, 0xA0, 0x91, 0xFD, 0x41, 0x95, 0x6B, 0x47, 0x89, 0x1E, 0x3A,
0x19, 0xED, 0xDD, 0xAA, 0xF4, 0xBE, 0x0D, 0x00, 0x9D, 0xC1, 0xEC, 0x18, 0xD9, 0x81, 0x7F, 0xD9,
0x85, 0xC3, 0x52, 0x0C, 0xF4, 0x7F, 0x7D, 0xD5, 0x7B, 0x5F, 0xA2, 0x4F, 0x10, 0x80, 0xF6, 0xF0,
0xAA, 0xAB, 0xFC, 0x14, 0xA0, 0x9B, 0xAE, 0xDD, 0xE6, 0xEA, 0x16, 0xB0, 0xAF, 0xCF, 0x03, 0xDF,
0xC4, 0x18, 0x25, 0x6B, 0xE7, 0x54, 0xB1, 0xC2, 0x2F, 0x5E, 0xC6, 0x8D, 0x37, 0xEE, 0xB8, 0x81,
0x9F, 0x6F, 0x26, 0xAE, 0x88, 0xDC, 0x6E, 0x52, 0xF7, 0x59, 0x54, 0x13, 0xE1, 0xBE, 0xAC, 0xC6,
0xAF, 0x9A, 0x10, 0x91, 0x02, 0x7D, 0x77, 0x62, 0x88, 0xE4, 0x39, 0xA1, 0x89, 0x03, 0x06, 0x50,
0x1A, 0xFC, 0x09, 0x01, 0x8F, 0xCF, 0x62, 0x71, 0x1C, 0xCE, 0x72, 0xEA, 0xF6, 0x39, 0xA2, 0xE3,
0x13, 0xDE, 0x0A, 0xBC, 0xC4, 0xA3, 0xA4, 0x70, 0xD5, 0x56, 0xD0, 0x72, 0x71, 0x7E, 0x2D, 0xC5,
0x92, 0xBB, 0xD8, 0x77, 0x5F, 0x86, 0xAB, 0xC2, 0x2F, 0x10, 0xEA, 0x46, 0x31, 0xC1, 0x21, 0xC7,
0xF8, 0x21, 0x86, 0x5B, 0x2A, 0x8C, 0xDC, 0x50, 0xC7, 0x9C, 0x57, 0x22, 0x11, 0x30, 0x09, 0x30,
0xCD, 0x86, 0x73, 0x9E, 0xAA, 0xAF, 0x68, 0xCD, 0xC0, 0x1F, 0x5C, 0x1B, 0x25, 0x9C, 0x98, 0x3C,
0xE8, 0x47, 0xE1, 0x40, 0xCD, 0x20, 0x0A, 0x06, 0xD9, 0x6E, 0x22, 0xB7, 0x2F, 0xF0, 0xA0, 0xA5,
0x95, 0xB1, 0xA8, 0xD3, 0x9F, 0x97, 0x9B, 0x00, 0xEC, 0x87, 0xCD, 0x1A, 0x01, 0xD8, 0xD1, 0xC9,
0x80, 0xB4, 0xA9, 0xAF, 0x8D, 0x87, 0x6B, 0xB9, 0xE8, 0x5E, 0x9D, 0x35, 0x43, 0xF0, 0xD0, 0xD1,
0xB7, 0xF7, 0x46, 0xFA, 0xFA, 0xF5, 0xAC, 0x9C, 0x92, 0xBE, 0x88, 0x01, 0x6F, 0x08, 0xF6, 0x31,
0xF4, 0xC9, 0x04, 0x45, 0x9D, 0x41, 0x56, 0x88, 0x06, 0x15, 0xCA, 0x36, 0x4C, 0x11, 0x91, 0xBF,
0x1C, 0x00, 0x4D, 0x32, 0x4F, 0x84, 0x80, 0x54, 0x8A, 0xD7, 0x67, 0xB4, 0xC3, 0x1A, 0x41, 0x88,
0xE1, 0xAC, 0x2A, 0x81, 0xE7, 0xA8, 0xDA, 0x7E, 0xC4, 0x84, 0x62, 0x5E, 0xC1, 0xB3, 0xC0, 0x71,
0xA0, 0x8B, 0x74, 0xB9, 0x08, 0xD3, 0x02, 0xEA, 0xE8, 0x5B, 0x26, 0x87, 0xAF, 0x05, 0x4E, 0xA3,
0x19, 0x21, 0x84, 0xB7, 0x38, 0xF2, 0x1E, 0xFD, 0x0E, 0x58, 0x67, 0x73, 0x3C, 0x0A, 0x08, 0xF7,
0x0C, 0x31, 0xBC, 0x89, 0xD4, 0xDA, 0x06, 0xD5, 0x54, 0xE9, 0x32, 0xBE, 0x8E, 0xAE, 0xA9, 0xF7,
0x5D, 0x50, 0xBD, 0x06, 0x2D, 0xD6, 0xC6, 0x45, 0x00, 0x07, 0x4D, 0x0E, 0x8C, 0x58, 0x53, 0xC7,
0x8D, 0x26, 0x2D, 0xE6, 0x7D, 0xCB, 0xF0, 0x3F, 0xD8, 0x46, 0x0F, 0x99, 0x14, 0xF5, 0x09, 0x77,
0xC4, 0x7E, 0x34, 0x14, 0x7C, 0x25, 0xB7, 0x8B, 0xAA, 0x86, 0x6D, 0xEB, 0xC2, 0x13, 0x25, 0xD6,
0xFC, 0x1D, 0x84, 0xDA, 0x10, 0x4E, 0xAF, 0x0D, 0x49, 0x2B, 0x7B, 0xE8, 0xB9, 0x03, 0x19, 0x36,
0x10, 0x21, 0xDF, 0xA0, 0x7B, 0x01, 0xA5, 0x29, 0xF1, 0xA9, 0x83, 0x2B, 0xDF, 0x17, 0x8D, 0x67,
0x06, 0x2C, 0xEC, 0x8E, 0xF8, 0x9A, 0x16, 0xDB, 0x08, 0xC4, 0x11, 0x56, 0xFC, 0xC5, 0xB7, 0x39,
0x70, 0xE1, 0xA1, 0xB2, 0x73, 0x87, 0xFF, 0xE2, 0xB9, 0xC0, 0x82, 0xB9, 0xCC, 0xB4, 0x38, 0x45,
0x14, 0x2C, 0xEC, 0x23, 0x2E, 0x96, 0x5A, 0x79, 0xDA, 0x29, 0x60, 0x17, 0x4D, 0xCA, 0xFA, 0x86,
0xC1, 0x02, 0x31, 0x57, 0x74, 0x78, 0x75, 0xE2, 0x0A, 0x91, 0x08, 0xFD, 0x9F, 0x09, 0x11, 0x7E,
0x84, 0x5A, 0x3C, 0x96, 0x74, 0x05, 0x08, 0x26, 0x37, 0xD0, 0xE9, 0x3C, 0x44, 0x0C, 0xA8, 0x46,
0x05, 0x1F, 0x0E, 0x07, 0xB5, 0x60, 0xD9, 0xD0, 0xA0, 0x39, 0x58, 0xCC, 0x0D, 0x5C, 0xC4, 0xAA,
0xC7, 0x79, 0x0E, 0x9E, 0x93, 0x22, 0xD8, 0xC5, 0x6B, 0x88, 0x43, 0x3F, 0x14, 0xB4, 0x0B, 0x4E,
0x87, 0x64, 0x59, 0x76, 0x71, 0x15, 0x0F, 0xD9, 0xE9, 0x5F, 0xD1, 0x39, 0xB7, 0xF3, 0xCB, 0x6A,
0x4E, 0x0C, 0x46, 0xE4, 0x87, 0xCE, 0xF5, 0xB6, 0x9E, 0x87, 0x3C, 0x7E, 0x3A, 0xDF, 0x26, 0x2A,
0x29, 0xFC, 0x29, 0x04, 0x09, 0x20, 0x0B, 0x90, 0xF4, 0x08, 0x80, 0xC5, 0xE9, 0xD0, 0xC3, 0xE4,
0xD0, 0xEE, 0x05, 0x1A, 0x7B, 0x0E, 0x00, 0xEA, 0x5A, 0xE5, 0xE3, 0xDB, 0x78, 0x3D, 0xF2, 0x23,
0x01, 0xFF, 0x01, 0xF1, 0x29, 0x21, 0x7E, 0x21, 0x99, 0x23, 0x7D, 0xE1, 0xC5, 0xBA, 0x60, 0xAE,
0x2F, 0xA6, 0xB7, 0x07, 0x4A, 0xEA, 0xA0, 0x74, 0x1A, 0xB1, 0x4E, 0x20, 0xF4, 0x11, 0xFC, 0xA5,
0x9C, 0xE1, 0x4C, 0x91, 0x77, 0x86, 0xB5, 0x19, 0x88, 0xFF, 0xB2, 0xD9, 0xCF, 0xBA, 0xE1, 0x18,
0xE3, 0x62, 0x71, 0xED, 0x73, 0x7A, 0x7F, 0xDA, 0x9C, 0x10, 0xDE, 0xC6, 0xC2, 0x97, 0xC6, 0x77,
0x5E, 0x15, 0x75, 0x82, 0xAF, 0x3C, 0xF5, 0x22, 0x60, 0x57, 0x26, 0x90, 0x10, 0x9A, 0xA0, 0x02,
0xFE, 0xA6, 0x2F, 0xC2, 0xC8, 0x32, 0x81, 0x02, 0x18, 0x80, 0x6A, 0xB8, 0xC3, 0xCA, 0xBD, 0x4F,
0x7D, 0x93, 0x7A, 0x1A, 0x88, 0x23, 0x53, 0xC3, 0x8C, 0x10, 0x51, 0xDC, 0xB0, 0x9A, 0x8A, 0xDE,
0x47, 0x04, 0x47, 0xF7, 0x19, 0xC6, 0x1A, 0xCB, 0x96, 0x61, 0x6D, 0x6E, 0x33, 0x46, 0xEF, 0xF3,
0x72, 0x00, 0x4D, 0x45, 0xCF, 0x91, 0xCB, 0x25, 0x63, 0x75, 0x44, 0x9F, 0x81, 0x01, 0x0E, 0x6E,
0xE1, 0xA5, 0x42, 0x00, 0x76, 0x98, 0x08, 0x8E, 0xCF, 0x73, 0x4A, 0xA3, 0x9E, 0x72, 0xB2, 0x13,
0x3E, 0xF5, 0xD9, 0x0D, 0xCF, 0x3E, 0xDD, 0xEB, 0xC8, 0x91, 0x53, 0xCC, 0x35, 0x28, 0xE5, 0x46,
0x72, 0xB4, 0xAD, 0x32, 0x49, 0x48, 0xF2, 0x5B, 0x27, 0xBF, 0x6D, 0xC5, 0x6C, 0x8B, 0xC1, 0x10,
0x1F, 0x77, 0xC1, 0x7D, 0x0C, 0x60, 0xCA, 0xEF, 0x80, 0x9E, 0xBA, 0x21, 0x7A, 0x1F, 0x37, 0x71,
0xBD, 0x93, 0x02, 0x5E, 0xB6, 0x92, 0x97, 0xA0, 0x93, 0xC8, 0xB9, 0x34, 0x0F, 0x5D, 0x6A, 0x40,
0x3F, 0x2E, 0xCA, 0xFF, 0x35, 0xA6, 0x0C, 0x5B, 0x33, 0x20, 0x15, 0x6E, 0x09, 0x39, 0x53, 0xD4,
0x44, 0x1D, 0xC4, 0xD9, 0x04, 0x13, 0xE4, 0x0D, 0x90, 0x07, 0x30, 0xC8, 0xAC, 0x4D, 0xB8, 0x81,
0x04, 0xAE, 0xEA, 0xE1, 0x77, 0x47, 0x70, 0xDE, 0xCC, 0xBF, 0x69, 0x19, 0x82, 0x02, 0x6C, 0x66,
0xEA, 0xA7, 0xDB, 0x31, 0x87, 0xC1, 0x98, 0x59, 0x49, 0xA3, 0xCE, 0xC6, 0x2D, 0xD4, 0xC8, 0x4B,
0x35, 0xF6, 0xA0, 0xB6, 0x56, 0x62, 0x11, 0x76, 0xF3, 0x63, 0x36, 0x47, 0xFF, 0xCD, 0xE6, 0xE4,
0xB6, 0x22, 0x81, 0x57, 0x53, 0xAA, 0x2F, 0x65, 0xF4, 0x25, 0xB1, 0x75, 0xE5, 0xD5, 0xAC, 0x33,
0x6B, 0x59, 0x63, 0x2A, 0x80, 0x4A, 0xA0, 0x87, 0x85, 0x6F, 0x90, 0x0E, 0x8D, 0xA3, 0xEF, 0xF7,
0xC8, 0x8D, 0xC1, 0x40, 0xD8, 0x99, 0x96, 0xC4, 0x1F, 0xD5, 0xE8, 0x93, 0x4E, 0x44, 0xA8, 0xEB,
0x15, 0xA1, 0x4A, 0xDF, 0x40, 0x1E, 0x8C, 0x3A, 0x43, 0x04, 0x8A, 0x31, 0x1E, 0x09, 0xD4, 0xC8,
0x74, 0xF3, 0xA6, 0x10, 0xA9, 0x30, 0x4D, 0x77, 0xEE, 0xF0, 0x2A, 0xC5, 0x9E, 0x08, 0x55, 0x04,
0x9A, 0x13, 0xC7, 0x3E, 0x1D, 0x29, 0x3A, 0xDC, 0xEE, 0x22, 0x75, 0xDD, 0x23, 0xB5, 0xE5, 0x93,
0x0E, 0x10, 0x99, 0x39, 0xD6, 0x55, 0x78, 0x14, 0x61, 0xAD, 0x4A, 0x8F, 0x46, 0xA4, 0x71, 0xAE,
0x37, 0xEA, 0xA1, 0x75, 0x10, 0x72, 0xAE, 0x72, 0x8C, 0x1B, 0x72, 0x12, 0x5D, 0xC5, 0xEC, 0x20,
0x2A, 0xF7, 0xC9, 0x4B, 0xED, 0x40, 0x98, 0x5D, 0xC6, 0x0A, 0x28, 0x40, 0xDA, 0xB0, 0x0F, 0x46,
0xC2, 0x6E, 0xD2, 0x33, 0xB5, 0x67, 0x53, 0xA5, 0xD3, 0x32, 0xEF, 0xA4, 0x77, 0x64, 0x05, 0xC6,
0xCA, 0xBD, 0x90, 0x83, 0xFC, 0xDD, 0x9C, 0xB0, 0x43, 0x4D, 0x04, 0x55, 0x7E, 0x0C, 0xC9, 0x80,
0x0A, 0x2C, 0x55, 0x34, 0x39, 0x68, 0x42, 0xE0, 0x2A, 0x1F, 0x9D, 0xF6, 0xE9, 0xF6, 0x78, 0x7A,
0xB8, 0xED, 0x98, 0x9E, 0xC0, 0x95, 0xBC, 0xE2, 0x59, 0xC5, 0x93, 0x25, 0x75, 0x4A, 0x19, 0x19,
0x49, 0x47, 0x50, 0xD6, 0x51, 0x14, 0xDD, 0x6D, 0x83, 0xB5, 0x9B, 0x1E, 0x71, 0x81, 0xF0, 0x29,
0x50, 0x98, 0xF8, 0xCE, 0x1C, 0x6E, 0xBF, 0xDE, 0x4B, 0x0F, 0xF3, 0x5F, 0x72, 0x72, 0xC3, 0xE6,
0x67, 0x34, 0xB0, 0x18, 0x8B, 0xFD, 0x5C, 0x7A, 0x55, 0xE4, 0x12, 0x39, 0x62, 0xF8, 0x45, 0x31,
0x1F, 0x94, 0x32, 0xEC, 0x89, 0xF9, 0xB0, 0x8D, 0xBA, 0xE2, 0x2D, 0x96, 0xAF, 0xE5, 0x1A, 0x6C,
0x43, 0xAC, 0xB8, 0x87, 0x63, 0x3A, 0xBA, 0x72, 0x78, 0xE5, 0x36, 0x22, 0x7B, 0x13, 0x40, 0x1B,
0xDD, 0x86, 0xA4, 0x1B, 0x73, 0x3C, 0xD9, 0x63, 0xB8, 0xFC, 0x6B, 0x2E, 0xC8, 0x3D, 0x03, 0xA6,
0x5F, 0x60, 0x57, 0xEA, 0x3F, 0x22, 0x8C, 0xF5, 0x9A, 0x73, 0x56, 0x99, 0xF7, 0xEF, 0xBA, 0xCC,
0x81, 0x46, 0xD4, 0x9F, 0x72, 0x2D, 0x28, 0xAD, 0xFA, 0x53, 0x45, 0xF6, 0x44, 0x0B, 0x85, 0x40,
0x68, 0x2C, 0x09, 0xEC, 0xFA, 0x1E, 0x1C, 0xDA, 0xB3, 0xE4, 0x4C, 0xC9, 0x87, 0x50, 0xD5, 0xF5,
0x24, 0x4B, 0x05, 0x8A, 0x93, 0xB9, 0x44, 0x0B, 0x19, 0xA5, 0xB8, 0x47, 0x4A, 0x00, 0x31, 0xAF,
0x99, 0x04, 0xE1, 0x4F, 0x5B, 0x81, 0x3A, 0xC1, 0x1E, 0x2B, 0x55, 0xF0, 0x6D, 0xD9, 0x4A, 0x09,
0x2D, 0x1F, 0x92, 0x6D, 0x7C, 0xC2, 0x2A, 0xD0, 0x72, 0x91, 0x09, 0x81, 0x2D, 0x50, 0x62, 0x62,
0x35, 0xEF, 0xD5, 0x41, 0x0E, 0x13, 0x56, 0x3E, 0x8F, 0xEB, 0xD0, 0xF7, 0x88, 0x23, 0xB0, 0xDE,
0xB4, 0x9C, 0xE5, 0xCB, 0x72, 0x10, 0xEE, 0x94, 0x96, 0x0F, 0x14, 0x48, 0xAD, 0x2E, 0xA1, 0x07,
0x27, 0x03, 0x84, 0x6E, 0x0E, 0xCC, 0x46, 0xFB, 0xB2, 0xA3, 0xE5, 0x75, 0x21, 0xEF, 0xEC, 0xCE,
0x3C, 0xBA, 0xB3, 0x94, 0x23, 0x7B, 0xC9, 0x59, 0x56, 0x66, 0xE9, 0xEB, 0x6D, 0x7A, 0x09, 0xC2,
0x99, 0x9B, 0x8D, 0x79, 0x03, 0x52, 0x24, 0x37, 0x6B, 0xF3, 0x01, 0x44, 0x8A, 0xFF, 0x58, 0x26,
0x1F, 0xC2, 0x0B, 0xA3, 0x7B, 0x39, 0xBE, 0x4A, 0x90, 0x94, 0x23, 0x85, 0x0C, 0x68, 0x4A, 0x07,
0xFE, 0x4C, 0xCC, 0xE5, 0xD8, 0xF4, 0x09, 0xDF, 0xA2, 0xB8, 0xF7, 0x28, 0xAD, 0xCB, 0x4C, 0x6B,
0x57, 0xD5, 0xAA, 0x2D, 0x01, 0x6E, 0xB1, 0x63, 0x66, 0xF4, 0x20, 0x48, 0x62, 0xFE, 0x97, 0x8B,
0xF5, 0x5A, 0x00, 0x72, 0xC5, 0x71, 0xAF, 0xD4, 0x8B, 0xC3, 0x83, 0x74, 0xA3, 0x52, 0xC4, 0xC8,
0x41, 0xC7, 0xB0, 0x19, 0x88, 0xF7, 0x7B, 0xC0, 0x14, 0xF2, 0xCB, 0x5E, 0x93, 0xC5, 0x4B, 0xBE,
0xD7, 0xE4, 0x23, 0xCA, 0x7B, 0x9A, 0xC2, 0x1B, 0x9D, 0xCE, 0x12, 0x73, 0x10, 0x5E, 0x19, 0xD7,
0x8A, 0x49, 0x66, 0x85, 0xF7, 0x5A, 0xFF, 0x73, 0x81, 0x71, 0xCB, 0xE0, 0x1A, 0x98, 0x98, 0x0D,
0xD5, 0x1A, 0x4E, 0xC7, 0xBA, 0x9D, 0x73, 0xB4, 0xBA, 0x96, 0x02, 0xFB, 0xE3, 0x8D, 0x1A, 0x96,
0x29, 0xC3, 0x0F, 0x64, 0x6F, 0x40, 0x86, 0x1D, 0xB6, 0x16, 0x57, 0xFA, 0x4D, 0x4C, 0xB6, 0x01,
0x32, 0xF3, 0x4D, 0x16, 0x74, 0xCA, 0x9F, 0xD0, 0x81, 0xA5, 0x91, 0x86, 0x78, 0x33, 0x47, 0xF0,
0xAA, 0x19, 0x92, 0x9F, 0x41, 0xF3, 0x79, 0x34, 0x7F, 0x07, 0xCD, 0x9B, 0xD5, 0x62, 0xB1, 0xB7,
0xCA, 0x14, 0xCA, 0x45, 0xB1, 0x9A, 0xF1, 0x95, 0x7A, 0x30, 0x9F, 0xFB, 0x05, 0x95, 0x79, 0xF5,
0x1D, 0xAD, 0x9E, 0xB9, 0xAE, 0x1D, 0x32, 0x51, 0xAD, 0xAB, 0x37, 0xB5, 0xC8, 0x0E, 0x56, 0xE5,
0x50, 0xAD, 0x85, 0x76, 0x36, 0x6F, 0xDE, 0xF4, 0x8F, 0xBA, 0xEF, 0x3D, 0xEA, 0xBE, 0xB3, 0xEA,
0xEE, 0x1F, 0xF8, 0xF7, 0x0A, 0xDD, 0xB4, 0xA9, 0xED, 0x17, 0xF8, 0xB1, 0x83, 0x77, 0x8B, 0x5C,
0x9E, 0xD1, 0x1D, 0x14, 0xDA, 0x84, 0xD9, 0xEC, 0x5D, 0x66, 0x2F, 0x24, 0xA8, 0x77, 0x64, 0x33,
0xAE, 0xE3, 0x7A, 0x53, 0xDE, 0x09, 0x9D, 0xC9, 0xCD, 0x4B, 0x4E, 0xFA, 0x2D, 0x89, 0xE1, 0x42,
0x9B, 0x28, 0x41, 0xAE, 0xCC, 0x35, 0x88, 0xAF, 0xBF, 0x91, 0xD4, 0x53, 0xDC, 0x11, 0x38, 0x7F,
0x21, 0xB2, 0x8E, 0x62, 0xDA, 0xF7, 0x33, 0xF5, 0x42, 0x8C, 0xD1, 0x55, 0xBE, 0xA6, 0xCA, 0x87,
0x1F, 0x23, 0x7B, 0x81, 0x0E, 0x4A, 0x71, 0xB7, 0x80, 0x02, 0xAD, 0x3E, 0x03, 0x20, 0x49, 0xF5,
0x13, 0xFF, 0x3F, 0xD6, 0xFF, 0x7C, 0x48, 0x8E, 0x92, 0xF6, 0x1C, 0xDD, 0x17, 0x82, 0xAC, 0x55,
0x4F, 0xCE, 0xD5, 0x60, 0x88, 0xF7, 0x61, 0x3A, 0x25, 0x95, 0x48, 0x3C, 0x50, 0x3E, 0x93, 0x42,
0x5A, 0x0F, 0xBA, 0x71, 0x20, 0x50, 0xA8, 0x66, 0x05, 0xE8, 0x15, 0xCE, 0x31, 0x53, 0x6B, 0xF8,
0xCB, 0xD1, 0x95, 0x41, 0x59, 0xE6, 0x33, 0x8C, 0xF2, 0xB3, 0x97, 0x49, 0xC1, 0x50, 0xBE, 0x16,
0xE2, 0xAD, 0xA4, 0xB7, 0xF3, 0xE8, 0xC7, 0xB5, 0xCC, 0x08, 0xA1, 0x68, 0xD1, 0xCC, 0x35, 0x7F,
0x29, 0xC9, 0xB4, 0xF8, 0x4D, 0xC5, 0x2A, 0x17, 0x2F, 0x7D, 0xA6, 0x5C, 0xEB, 0xAF, 0xD4, 0xF0,
0x5E, 0xC7, 0x72, 0x38, 0x18, 0x95, 0xC5, 0x9B, 0x7A, 0x97, 0xBB, 0x18, 0xA7, 0x05, 0x82, 0x84,
0xA8, 0x8C, 0xC1, 0x14, 0x2D, 0x7A, 0x65, 0xB5, 0xBD, 0x5B, 0x20, 0x69, 0x21, 0x49, 0xA4, 0x47,
0x69, 0x47, 0xBD, 0x55, 0x74, 0x7F, 0x14, 0x4F, 0xD3, 0x96, 0xA4, 0x88, 0xCC, 0x95, 0x7A, 0xC1,
0xFB, 0x4E, 0x49, 0x65, 0xA6, 0xD7, 0x5A, 0x40, 0xD6, 0x9A, 0x56, 0xAF, 0x25, 0x96, 0xD2, 0x84,
0xE3, 0x36, 0x8A, 0x8E, 0x0B, 0xB2, 0x3C, 0xC5, 0x6D, 0xCF, 0x69, 0x34, 0x0D, 0xC1, 0xB5, 0x83,
0xFC, 0x09, 0xCC, 0xF7, 0x09, 0xB7, 0x1C, 0xC9, 0x33, 0x5E, 0xD7, 0xF3, 0x57, 0x71, 0xE1, 0x49,
0x3E, 0x21, 0xE5, 0x19, 0xE8, 0xA8, 0xD4, 0x8D, 0x07, 0x32, 0xAF, 0x32, 0xAD, 0x51, 0x76, 0x43,
0x38, 0xB2, 0xA1, 0x3B, 0xF4, 0xC7, 0xD9, 0xB8, 0x07, 0xAF, 0xD2, 0xB4, 0x2D, 0xDE, 0xE9, 0x09,
0x58, 0x7B, 0xAB, 0x3D, 0x1D, 0x90, 0x23, 0x57, 0xBD, 0x55, 0x35, 0x08, 0x30, 0xAD, 0x64, 0xA8,
0xC6, 0x90, 0x18, 0xA1, 0x7A, 0x54, 0xFD, 0x9D, 0x64, 0xD4, 0x6C, 0x82, 0x79, 0xA2, 0x8F, 0x61,
0x62, 0xA3, 0xD5, 0x52, 0x0B, 0x24, 0x04, 0x2B, 0xAF, 0x35, 0x05, 0x2A, 0xFE, 0xDA, 0x99, 0xF5,
0x9A, 0xA7, 0x36, 0x55, 0x28, 0x65, 0xFF, 0xE0, 0x9D, 0x05, 0xAA, 0x36, 0x80, 0x2A, 0x3F, 0x93,
0x77, 0x7E, 0xCE, 0xE6, 0x85, 0xCB, 0x9E, 0x4E, 0x81, 0x13, 0x6E, 0x86, 0x01, 0x93, 0xA0, 0x37,
0x39, 0x2E, 0xDD, 0xD7, 0x63, 0x9F, 0x78, 0xAD, 0xE3, 0x9E, 0xF6, 0x57, 0xC8, 0x7E, 0x30, 0x24,
0x5D, 0xD1, 0x6C, 0xE9, 0xEA, 0x12, 0x02, 0xE8, 0xD5, 0xCF, 0x4A, 0x72, 0x10, 0xCC, 0x06, 0x15,
0x8A, 0x2D, 0x7A, 0x42, 0xD8, 0xCD, 0x84, 0xC2, 0x92, 0xB6, 0x2B, 0x69, 0x05, 0xBC, 0x70, 0xEF,
0x12, 0x25, 0x85, 0x9B, 0xAB, 0x09, 0xAB, 0x59, 0x3C, 0x1A, 0x03, 0xA8, 0x17, 0x49, 0x1C, 0xD0,
0x74, 0x0E, 0xAB, 0x08, 0xAA, 0x2F, 0xC2, 0xE8, 0x57, 0xEB, 0xBA, 0x07, 0x78, 0xCD, 0xD7, 0xF3,
0xE0, 0xB2, 0x14, 0xFF, 0xE9, 0xBB, 0x0C, 0xA1, 0x79, 0xCF, 0x8F, 0x30, 0x49, 0x3C, 0x05, 0x28,
0x0D, 0x98, 0x70, 0x8A, 0xFC, 0x91, 0x8E, 0xFF, 0xD6, 0x9F, 0xCC, 0x43, 0x42, 0x3B, 0x15, 0x3E,
0x02, 0x41, 0xF5, 0x3A, 0x9F, 0xFF, 0xB1, 0x6F, 0xCC, 0xC4, 0x3C, 0x47, 0x2C, 0x8F, 0x74, 0x7F,
0xF4, 0x0B, 0xD9, 0x90, 0x4D, 0xA0, 0xBC, 0xA9, 0xBF, 0x86, 0xDA, 0x61, 0x64, 0xC8, 0x12, 0x54,
0x2A, 0x3F, 0xC4, 0xAD, 0x6E, 0x37, 0x1D, 0x76, 0x92, 0xDC, 0x23, 0xCD, 0x9F, 0x19, 0xA5, 0x77,
0xAA, 0xBC, 0xF4, 0xED, 0x5A, 0x96, 0xB6, 0x84, 0xCB, 0x1D, 0x54, 0xE8, 0xEC, 0xB8, 0x8B, 0x45,
0x39, 0xD2, 0xBE, 0x9A, 0x37, 0xE5, 0xD3, 0x2E, 0x1C, 0x20, 0x85, 0x2D, 0x81, 0x0E, 0x8F, 0xC3,
0x05, 0xF1, 0x83, 0xFB, 0x6D, 0xB2, 0x54, 0xE2, 0x35, 0x2D, 0x2A, 0x16, 0x5E, 0x62, 0xEE, 0x1D,
0x3D, 0xB9, 0x5E, 0x38, 0xE7, 0x49, 0x94, 0xD9, 0x7A, 0xF6, 0x55, 0x52, 0x16, 0xE4, 0x2B, 0x08,
0xDC, 0xC4, 0xBA, 0x7F, 0xC9, 0x7D, 0xCC, 0x3D, 0xB5, 0xEC, 0xA7, 0xC7, 0x28, 0xDC, 0x19, 0x21,
0x19, 0x37, 0xCE, 0xDE, 0xAD, 0x9C, 0xF1, 0x9F, 0xB8, 0xC0, 0xBF, 0xF1, 0x14, 0xBA, 0x0A, 0x30,
0xC0, 0xA0, 0x90, 0x3E, 0xED, 0x8B, 0xFF, 0x98, 0x8A, 0xCE, 0xF4, 0x67, 0xB8, 0x01, 0xB7, 0xC2,
0xA8, 0x53, 0x80, 0x75, 0x7C, 0xB3, 0xE6, 0x47, 0x6E, 0x2E, 0x0A, 0x0B, 0xDF, 0x37, 0xBC, 0xB7,
0xF9, 0xDE, 0x20, 0x0F, 0xBA, 0x20, 0x39, 0x82, 0x53, 0xE6, 0x31, 0x2B, 0x96, 0x03, 0x62, 0x98,
0x45, 0xAA, 0x3D, 0xDA, 0xBE, 0xED, 0xA7, 0x04, 0x2C, 0xCE, 0x31, 0x77, 0x44, 0xC7, 0xDF, 0xCC,
0x0F, 0x80, 0x8C, 0x2B, 0x87, 0x97, 0xA3, 0x13, 0x8D, 0xA7, 0xBE, 0x70, 0xD7, 0xE9, 0x57, 0x28,
0x2D, 0xA5, 0x68, 0xE1, 0x4D, 0xEB, 0x52, 0xB8, 0xD8, 0xCF, 0xA7, 0x53, 0x4C, 0xF5, 0x73, 0x4F,
0x3D, 0x9C, 0x3A, 0x9C, 0xAE, 0x2A, 0x8F, 0xDC, 0x06, 0xBF, 0xE9, 0xB1, 0x4C, 0x38, 0xCE, 0xBF,
0xFB, 0xF2, 0x5C, 0x0F, 0x12, 0xB4, 0x45, 0x16, 0x4D, 0x57, 0x00, 0x05, 0x2A, 0x11, 0xBF, 0x64,
0xFF, 0x49, 0x83, 0x8C, 0xB8, 0x45, 0x02, 0xE0, 0x98, 0xBB, 0xAF, 0x41, 0xF3, 0x7F, 0x26, 0x93,
0x1F, 0x56, 0xCC, 0x9A, 0xFB, 0x84, 0x08, 0x8F, 0xDF, 0x70, 0x94, 0x37, 0x8D, 0x8E, 0x03, 0xE6,
0xB4, 0x05, 0xC2, 0x92, 0xB1, 0xA2, 0x72, 0xD1, 0x84, 0x6C, 0x99, 0x01, 0x02, 0x90, 0x26, 0xFB,
0xE4, 0x6D, 0x21, 0x9F, 0x73, 0x3D, 0xF2, 0xE8, 0x32, 0x35, 0x37, 0x5B, 0x89, 0xFE, 0xAB, 0xD9,
0xD9, 0xC0, 0x48, 0x1B, 0xD1, 0x47, 0xB5, 0x04, 0x0F, 0x4B, 0x7B, 0x03, 0xAA, 0xED, 0x02, 0x86,
0x73, 0x45, 0x3E, 0xC6, 0x2D, 0xCA, 0x25, 0x39, 0xC3, 0x25, 0xFF, 0x7B, 0xDF, 0xA6, 0xDC, 0x25,
0xD8, 0x93, 0xA4, 0xC5, 0xFB, 0xD9, 0x25, 0x92, 0x1A, 0xCC, 0x1E, 0x4D, 0x2B, 0xFF, 0x50, 0x16,
0xF5, 0x2E, 0xB7, 0x96, 0x11, 0xE3, 0x71, 0x63, 0xB9, 0xD3, 0x8F, 0x88, 0x7D, 0x33, 0x03, 0xD3,
0x20, 0xB9, 0x9C, 0x62, 0xFF, 0x01, 0xC8, 0x14, 0xBD, 0x6D, 0x97, 0xFF, 0x8D, 0xE0, 0x4A, 0x51,
0xCC, 0xE5, 0x19, 0xF7, 0x55, 0x58, 0xC9, 0x21, 0x99, 0xEF, 0x26, 0x20, 0xF4, 0xE4, 0x37, 0x19,
0x41, 0x96, 0x24, 0x32, 0xE1, 0x4A, 0x8B, 0x72, 0x05, 0x26, 0xFC, 0x27, 0x14, 0x59, 0x01, 0xE9,
0x09, 0xC9, 0xEC, 0x33, 0x44, 0x0F, 0xB2, 0x1A, 0x25, 0x5E, 0x60, 0x35, 0x37, 0x95, 0xD4, 0x14,
0x97, 0xEA, 0xA4, 0x79, 0x31, 0xE8, 0x8F, 0x5D, 0x85, 0x5A, 0xE2, 0x32, 0xCA, 0x33, 0x28, 0x9C,
0x1A, 0x14, 0x99, 0x59, 0x1E, 0xFF, 0x61, 0xA6, 0x40, 0x60, 0x0F, 0xA0, 0x6E, 0xB6, 0xCB, 0x6A,
0xDD, 0xCE, 0x61, 0x4C, 0x42, 0x85, 0xFD, 0x2A, 0xC6, 0x91, 0x46, 0x49, 0xDC, 0xB2, 0x3A, 0x98,
0x71, 0x25, 0x76, 0x78, 0xF4, 0xE8, 0x1F, 0x21, 0xC0, 0xE8, 0x03, 0x00, 0x7B, 0xDA, 0x3E, 0xB8,
0xB5, 0xF1, 0xF8, 0xF7, 0x77, 0xF2, 0xAC, 0xF8, 0xD2, 0xBB, 0xA8, 0xD7, 0x4D, 0xB1, 0x81, 0xFF,
0x06, 0xE2, 0xD6, 0x11, 0xFF, 0x20, 0xFD, 0x44, 0x1A, 0x10, 0xCD, 0xF7, 0x5D, 0xD8, 0x51, 0x55,
0xDA, 0x67, 0xF8, 0xA7, 0xAE, 0x68, 0x8B, 0x3C, 0x69, 0xC2, 0x57, 0xBC, 0x3C, 0xFC, 0xE3, 0xD1,
0xC3, 0xDA, 0x0E, 0x3F, 0xC0, 0xD3, 0xFF, 0x07, 0xCD, 0x59, 0x3D, 0x90, 0xDD, 0x56, 0x15, 0x3E,
0xD2, 0xDD, 0xAC, 0x12, 0x04, 0x5C, 0x17, 0x36, 0xC3, 0x60, 0x6C, 0xA5, 0x48, 0x91, 0x19, 0x12,
0xAB, 0x49, 0xE1, 0xE2, 0xBD, 0x95, 0x82, 0x4B, 0x8A, 0xB8, 0xF0, 0x73, 0x8A, 0x14, 0xA4, 0xA0,
0x60, 0x60, 0x98, 0xA5, 0x48, 0xE1, 0xCC, 0xEC, 0xAE, 0x04, 0x2E, 0x53, 0xD8, 0x14, 0x21, 0x1D,
0xA4, 0x0E, 0x05, 0x2E, 0x3C, 0x8C, 0x87, 0x59, 0xAF, 0x14, 0xEF, 0x0C, 0x29, 0x28, 0x2C, 0x92,
0x21, 0x29, 0x52, 0x58, 0x10, 0x9B, 0x64, 0x12, 0x18, 0xCB, 0xB6, 0x8C, 0xB5, 0x63, 0xE9, 0x5D,
0xBE, 0xEF, 0x4A, 0x6F, 0x7F, 0xBC, 0x9B, 0xE0, 0xC4, 0x0E, 0x41, 0xB3, 0xD2, 0xEA, 0xE9, 0xEA,
0x9E, 0x7B, 0xEE, 0xF9, 0xFD, 0xCE, 0xD1, 0xFE, 0xCC, 0x4C, 0xF7, 0x8B, 0x1C, 0x59, 0x88, 0x36,
0x8F, 0x24, 0x59, 0x5B, 0x15, 0x1E, 0x95, 0xC8, 0x48, 0x44, 0x8B, 0xA8, 0xDC, 0xFE, 0x58, 0x8E,
0x95, 0x69, 0xBD, 0xEB, 0xD9, 0xFA, 0x3B, 0xEB, 0xB7, 0xCA, 0xEA, 0xE5, 0x7A, 0x34, 0xB7, 0xAA,
0x25, 0x52, 0xB9, 0xCE, 0x2B, 0x55, 0x8D, 0xA4, 0xC5, 0x8F, 0x63, 0xB9, 0x5F, 0x55, 0x32, 0x1D,
0x39, 0xA1, 0x79, 0xE1, 0x92, 0x31, 0xE5, 0x41, 0x73, 0x76, 0x27, 0x8D, 0xFE, 0x87, 0x1B, 0x83,
0x7C, 0x96, 0x8A, 0x67, 0x6A, 0xD1, 0xEF, 0xB6, 0x12, 0xC9, 0x92, 0x8C, 0x31, 0xB6, 0x24, 0xFB,
0x84, 0x6B, 0xB7, 0xFD, 0x19, 0x19, 0x13, 0xE3, 0x94, 0x6F, 0x6D, 0x4C, 0xC4, 0xA9, 0x31, 0x0D,
0x04, 0x14, 0xCF, 0x52, 0xC4, 0x2B, 0x44, 0xFC, 0x5C, 0xE6, 0x8C, 0x31, 0x2D, 0x4F, 0xBC, 0x57,
0xCF, 0x89, 0xCC, 0xE9, 0xF8, 0x84, 0xF7, 0xE6, 0xBF, 0xCD, 0x87, 0x85, 0x36, 0x26, 0x77, 0x6A,
0xBC, 0x76, 0x01, 0x24, 0xC7, 0x12, 0x60, 0x5D, 0x95, 0xAB, 0xC2, 0xA9, 0xF0, 0xE0, 0x82, 0x84,
0xE9, 0x45, 0x09, 0x8C, 0x29, 0x82, 0xB0, 0x5B, 0xD6, 0xB2, 0xCF, 0xCB, 0xB9, 0xE1, 0xC8, 0xC4,
0x41, 0x17, 0x4E, 0x45, 0xB7, 0xAA, 0xC6, 0x22, 0x6E, 0x2B, 0x78, 0xDE, 0x89, 0x4E, 0x25, 0xC1,
0x7C, 0x89, 0xE2, 0x05, 0x91, 0x20, 0x5F, 0xC2, 0x16, 0x8A, 0x46, 0xC4, 0xDC, 0x30, 0xB9, 0x64,
0x77, 0x4C, 0x8A, 0x5B, 0x4C, 0x3F, 0x90, 0xBD, 0x2A, 0x92, 0x80, 0x63, 0x5E, 0x48, 0x4C, 0x76,
0x5D, 0xE6, 0x0D, 0xA6, 0x05, 0xA6, 0x95, 0x5B, 0x97, 0x47, 0xF6, 0x8F, 0x03, 0x5B, 0xF7, 0x8B,
0x85, 0x6B, 0x1A, 0x88, 0x23, 0x94, 0xA5, 0x05, 0x79, 0x26, 0x03, 0xD9, 0x58, 0xEE, 0x94, 0x72,
0xB3, 0x93, 0x2A, 0x49, 0xCF, 0xFB, 0xD5, 0x92, 0xD3, 0x84, 0xF1, 0x58, 0x97, 0x87, 0xDD, 0x4E,
0x4B, 0x72, 0x46, 0xFC, 0x2B, 0xE2, 0x98, 0xFD, 0xB2, 0xB6, 0x24, 0xAB, 0x17, 0xA5, 0xC9, 0x5E,
0xAB, 0x22, 0x93, 0xFB, 0x9D, 0x2C, 0x7B, 0x57, 0x2A, 0x63, 0xF4, 0x9D, 0x62, 0x59, 0x5C, 0x03,
0x49, 0xF9, 0x06, 0x2C, 0x06, 0x85, 0xD3, 0x49, 0x10, 0x43, 0x6C, 0x10, 0xBF, 0x8C, 0xFC, 0x38,
0xAC, 0xBD, 0xD3, 0x79, 0x34, 0x95, 0x1B, 0xC5, 0x58, 0xA5, 0x87, 0xCE, 0x1D, 0x96, 0x52, 0xAD,
0x6A, 0xA8, 0xC5, 0x50, 0x51, 0x51, 0x0E, 0x29, 0xEB, 0x6A, 0x0C, 0x51, 0xFF, 0x13, 0xBB, 0x97,
0x0F, 0x9F, 0x6D, 0x1C, 0x79, 0x89, 0xF4, 0x47, 0x4F, 0xBB, 0xA6, 0x38, 0xAC, 0x72, 0x07, 0xE2,
0x5C, 0xC6, 0x66, 0x62, 0xAF, 0x96, 0x24, 0x96, 0xD0, 0x4C, 0xA9, 0x51, 0x6C, 0xCF, 0xAF, 0x3C,
0x93, 0x37, 0x63, 0xFF, 0x58, 0x21, 0x63, 0xC7, 0x14, 0x17, 0xC7, 0xFA, 0x58, 0xD1, 0xAC, 0xF8,
0xD3, 0xE9, 0x77, 0xBE, 0x06, 0xEA, 0x99, 0xB9, 0x0C, 0x95, 0x1F, 0x95, 0x73, 0xE0, 0x23, 0x5D,
0x91, 0xD6, 0xAF, 0x74, 0x9E, 0x49, 0xA7, 0x6A, 0xBF, 0xE2, 0xAD, 0x5F, 0xEA, 0x9C, 0x23, 0x5E,
0xAE, 0x53, 0x95, 0xFA, 0x32, 0x99, 0x4C, 0xA0, 0xD7, 0xCB, 0xC6, 0xDC, 0x6B, 0x8A, 0x4F, 0x1E,
0xC0, 0xC0, 0x15, 0x90, 0x5A, 0xBC, 0x2A, 0xFA, 0x57, 0xAB, 0x78, 0x34, 0xF2, 0x45, 0x8E, 0x9E,
0xCA, 0xCA, 0x3F, 0xE4, 0x37, 0xCA, 0xEB, 0x6A, 0x7D, 0xBD, 0xD5, 0x3F, 0xD3, 0x55, 0x54, 0x44,
0xF9, 0xAD, 0xFC, 0xAE, 0x7A, 0xEB, 0xF4, 0x6F, 0x82, 0xB7, 0xFE, 0x35, 0x9A, 0x38, 0x30, 0x53,
0x0D, 0xBE, 0x2A, 0x09, 0xA7, 0xD6, 0xC4, 0x0F, 0x4C, 0x7E, 0x60, 0x3A, 0x18, 0x8A, 0xD7, 0xB8,
0xA6, 0x5A, 0x59, 0x3C, 0x13, 0x2F, 0x55, 0xEA, 0xB2, 0x8C, 0x1A, 0xEF, 0xCF, 0xD7, 0x9A, 0xC8,
0xD0, 0x44, 0x47, 0xB2, 0xFD, 0x6F, 0xB2, 0x3C, 0x31, 0xF6, 0xB8, 0xE7, 0x79, 0x7F, 0x80, 0xDD,
0x7E, 0xD4, 0xA1, 0xDD, 0x7E, 0xBF, 0x4E, 0x74, 0xBE, 0x7A, 0x18, 0x46, 0x0B, 0xB9, 0xB6, 0xA2,
0x73, 0x7B, 0x71, 0x70, 0x31, 0x5D, 0x68, 0x2A, 0xBF, 0x09, 0xCC, 0xE5, 0x5F, 0x6C, 0xA4, 0x63,
0x09, 0x9D, 0x4C, 0x4C, 0xB5, 0x6F, 0x05, 0xF6, 0xAC, 0xAA, 0x83, 0x77, 0x4C, 0x9D, 0xC1, 0xB6,
0xE3, 0x23, 0x5E, 0xD5, 0x85, 0xC7, 0x8A, 0x67, 0x7A, 0xD2, 0x61, 0xEC, 0x56, 0xBA, 0x90, 0x16,
0xE6, 0x1F, 0x59, 0x3A, 0x11, 0x3C, 0x81, 0x24, 0x77, 0x3F, 0x80, 0x42, 0x64, 0x2A, 0xDC, 0x7A,
0xD0, 0xE8, 0x6E, 0x31, 0x79, 0xED, 0xBA, 0x79, 0xC5, 0x34, 0x59, 0xBC, 0x06, 0xEB, 0x25, 0x17,
0xD6, 0x85, 0xAC, 0x8B, 0x45, 0xC3, 0x03, 0x87, 0xEE, 0x28, 0x8B, 0xA6, 0xA1, 0xA9, 0x98, 0xAE,
0xF2, 0xCD, 0xAD, 0x3C, 0x32, 0x97, 0x1D, 0x63, 0x46, 0x9E, 0x69, 0xAB, 0x00, 0x3F, 0x13, 0x73,
0x59, 0xF0, 0xD3, 0xC5, 0x4F, 0x85, 0x9F, 0x0A, 0x3F, 0x9D, 0x33, 0xDC, 0x3A, 0x68, 0xDD, 0xCA,
0x05, 0x42, 0x13, 0xBD, 0xC7, 0xCF, 0xD2, 0x6A, 0x4B, 0xC1, 0x84, 0xE0, 0x9B, 0xCB, 0xC6, 0x2C,
0xCF, 0x39, 0xC6, 0x33, 0x4E, 0xAB, 0xCA, 0x48, 0x55, 0x8F, 0x70, 0xD5, 0xC3, 0x0E, 0x96, 0x2C,
0xA5, 0x91, 0x05, 0xF8, 0x99, 0xDA, 0xBA, 0xF1, 0xCD, 0x19, 0x53, 0xCD, 0x4F, 0x1D, 0xD3, 0x8E,
0xBD, 0xF7, 0xD3, 0xA8, 0x86, 0x48, 0x83, 0xC6, 0x31, 0xF9, 0x91, 0x15, 0xEF, 0x92, 0xA9, 0xE7,
0x3F, 0x12, 0x7A, 0xD2, 0xBA, 0xA9, 0xCF, 0x49, 0x29, 0xB5, 0x5B, 0x3A, 0x8D, 0xAA, 0x78, 0xBA,
0x8D, 0x87, 0x60, 0xA4, 0xCB, 0x28, 0x4D, 0x78, 0x1B, 0xA4, 0x91, 0xD4, 0x20, 0x26, 0x87, 0x64,
0xC7, 0xF1, 0x73, 0xA1, 0x6B, 0x23, 0x2C, 0x48, 0x06, 0xFE, 0xE8, 0xDB, 0x90, 0x07, 0xCD, 0x3F,
0xEA, 0x07, 0x20, 0x15, 0xD5, 0x4B, 0xCA, 0x29, 0x7B, 0x61, 0x55, 0xBD, 0xBC, 0x4E, 0xC9, 0x93,
0x1C, 0x1C, 0x09, 0xC5, 0x2D, 0x87, 0x25, 0xB4, 0x5A, 0x95, 0xA0, 0x92, 0xE4, 0xB8, 0x17, 0xEB,
0x55, 0xD7, 0x74, 0x2A, 0xF7, 0xCF, 0xC8, 0x4F, 0xDE, 0x70, 0x0B, 0x6F, 0x9D, 0x51, 0xA5, 0x52,
0x74, 0x26, 0x39, 0xAF, 0xAE, 0x2D, 0x83, 0xFE, 0x08, 0x42, 0x6D, 0xB8, 0x70, 0x44, 0x8F, 0x09,
0xFA, 0x28, 0xCB, 0x85, 0x47, 0xC3, 0xC2, 0x88, 0x72, 0x85, 0x7C, 0xCA, 0x51, 0xF4, 0xEF, 0x2C,
0xF5, 0x5C, 0x8F, 0x7B, 0xAE, 0x83, 0x9E, 0x31, 0xD2, 0x00, 0x63, 0x5E, 0x6A, 0xB9, 0x26, 0xF3,
0x60, 0xCC, 0x32, 0x8F, 0xC1, 0xCA, 0x6B, 0x38, 0x78, 0x4A, 0x9B, 0x02, 0x83, 0x23, 0xFD, 0x5E,
0x8B, 0xC1, 0xC3, 0xAA, 0x88, 0x10, 0xD3, 0xB4, 0x54, 0xFA, 0x4D, 0xD3, 0x61, 0xA2, 0x57, 0xBE,
0xF1, 0x06, 0x26, 0xD2, 0x3C, 0x30, 0xD1, 0xAD, 0x2D, 0x73, 0xF6, 0xDF, 0x85, 0xFE, 0xDF, 0x48,
0x14, 0xFF, 0x1D, 0x11, 0x75, 0x7B, 0x42, 0x56, 0xB1, 0x97, 0x82, 0xD1, 0x31, 0x32, 0xC3, 0x8A,
0x38, 0x8E, 0xEF, 0xE0, 0x78, 0x1F, 0xCE, 0x12, 0xEF, 0x95, 0xE4, 0xDA, 0xE5, 0x96, 0xC1, 0x75,
0x13, 0xE4, 0xE4, 0xFA, 0xDB, 0xCA, 0x7A, 0x06, 0x49, 0x73, 0x57, 0x08, 0x24, 0xA4, 0x11, 0x74,
0x96, 0x6B, 0xF7, 0xF7, 0x05, 0x16, 0xFF, 0x36, 0x37, 0x71, 0x8A, 0x3B, 0x88, 0xB0, 0x38, 0x64,
0x1D, 0xA6, 0x87, 0x20, 0xEB, 0x03, 0x59, 0xAE, 0x45, 0x2F, 0x61, 0x37, 0x7E, 0xEC, 0x3F, 0xE7,
0x4C, 0x63, 0x95, 0x23, 0x98, 0x51, 0x72, 0x56, 0xD6, 0x4E, 0xD5, 0xCB, 0xBA, 0xEE, 0x65, 0xBD,
0xD4, 0xCB, 0x7A, 0xDC, 0xCB, 0xFA, 0x88, 0xCC, 0x42, 0x89, 0x0D, 0x27, 0xE9, 0x0E, 0x76, 0xF7,
0x23, 0x7C, 0x89, 0x11, 0x5D, 0xE2, 0xAE, 0x3F, 0x5E, 0xE7, 0x36, 0x2B, 0xC9, 0xE2, 0xAC, 0x8E,
0x0C, 0x82, 0x2B, 0x95, 0x0D, 0x32, 0x7E, 0x8A, 0xE8, 0xA7, 0x9A, 0xC7, 0xB4, 0x41, 0x50, 0x94,
0x64, 0x46, 0x85, 0xC4, 0x45, 0xB5, 0xD6, 0x61, 0x6B, 0xEB, 0x53, 0x54, 0x80, 0x1C, 0xBC, 0x47,
0x8F, 0xBD, 0x86, 0x33, 0x5E, 0x34, 0x6D, 0xC3, 0x65, 0x0E, 0x91, 0x11, 0xE7, 0x79, 0x7F, 0xA6,
0x1C, 0xEB, 0x15, 0x0E, 0x51, 0x11, 0x6E, 0x19, 0xE2, 0x76, 0xEC, 0x34, 0x54, 0x3D, 0x7D, 0xB5,
0x91, 0x8B, 0xB4, 0x7C, 0x48, 0xD4, 0x65, 0x18, 0xC2, 0xB6, 0x20, 0x3F, 0x24, 0xC2, 0x20, 0xC5,
0x10, 0xD8, 0x83, 0x60, 0x7D, 0x2A, 0x59, 0xD6, 0x1C, 0x84, 0xC7, 0x6C, 0x8A, 0x9C, 0xA6, 0x19,
0x3E, 0xFB, 0xC3, 0x4F, 0x67, 0x0C, 0x3A, 0x76, 0xCD, 0xEC, 0x2C, 0x2E, 0xDF, 0x8C, 0xEF, 0xE1,
0xCF, 0x66, 0x43, 0xC7, 0x6E, 0x23, 0xE2, 0x06, 0x14, 0xF3, 0x99, 0xFC, 0x91, 0x3B, 0xD2, 0x4C,
0x07, 0x4E, 0xC5, 0xB1, 0x05, 0xBF, 0x60, 0x3C, 0x66, 0x10, 0x59, 0x55, 0xD6, 0x8A, 0xC3, 0x94,
0xB2, 0xEA, 0x13, 0x37, 0xEC, 0xC8, 0x50, 0xEC, 0xAB, 0xE2, 0x55, 0xD6, 0x46, 0x62, 0x0C, 0xB9,
0x8D, 0x35, 0xD5, 0x9C, 0x09, 0x7C, 0x8A, 0xE4, 0xE4, 0x98, 0x69, 0x66, 0xAC, 0xF9, 0xC8, 0xBC,
0x15, 0x8C, 0x5D, 0x93, 0xC6, 0x2D, 0xC1, 0x19, 0xDA, 0x44, 0x49, 0xEA, 0xE7, 0xA5, 0xBC, 0x47,
0x7E, 0xD6, 0xD6, 0x3A, 0x2B, 0xE6, 0x2D, 0xFE, 0x5E, 0xB6, 0xFC, 0x3D, 0x67, 0x7D, 0x8E, 0x20,
0xE2, 0x88, 0x57, 0xCE, 0xF8, 0x5B, 0xA2, 0xF9, 0xEA, 0x38, 0x98, 0xF1, 0x17, 0xD2, 0x70, 0x67,
0xFC, 0x29, 0xCB, 0x5F, 0x48, 0xFE, 0x9C, 0x76, 0x27, 0x7F, 0x90, 0x1F, 0xF8, 0x0B, 0xC9, 0x9F,
0x95, 0x51, 0x72, 0x0C, 0xBB, 0xD7, 0x53, 0x52, 0xBF, 0x41, 0xF9, 0xCD, 0xAB, 0x72, 0x2F, 0x3F,
0xF5, 0xE2, 0xCD, 0xBD, 0x44, 0x64, 0xC7, 0xB3, 0xC9, 0xE6, 0x0E, 0xB7, 0xA5, 0x43, 0x5A, 0x7C,
0xD9, 0x50, 0xA9, 0x54, 0xA7, 0x97, 0x43, 0x9D, 0xD2, 0x58, 0xF9, 0x71, 0x6D, 0xB7, 0x22, 0xAB,
0x56, 0x7E, 0x1E, 0x50, 0x0D, 0x35, 0xEA, 0x97, 0x74, 0x93, 0x84, 0xE8, 0x07, 0xEE, 0x87, 0x20,
0x1E, 0xA6, 0x40, 0x35, 0x6E, 0x0B, 0xFE, 0x10, 0x6D, 0x32, 0x84, 0x7A, 0x6C, 0xC6, 0x43, 0xB6,
0x47, 0xF2, 0xD6, 0x36, 0x6F, 0x53, 0x1C, 0xCB, 0xDE, 0x9E, 0x61, 0x64, 0x49, 0x86, 0x98, 0x2F,
0xAE, 0x65, 0x2A, 0x22, 0x53, 0xDE, 0x15, 0x32, 0xDC, 0x90, 0x29, 0xED, 0xD3, 0x8F, 0x2A, 0x12,
0x1B, 0x93, 0x29, 0xCF, 0xCA, 0xAF, 0xA5, 0xFD, 0xE9, 0x18, 0xF3, 0x60, 0x74, 0x9D, 0xE5, 0xAF,
0x24, 0x02, 0x8B, 0xC8, 0x1F, 0x98, 0x82, 0xFC, 0x82, 0x9C, 0xE8, 0xAC, 0x97, 0x5F, 0x19, 0x18,
0x98, 0xE8, 0x07, 0xA6, 0x56, 0xB4, 0xD0, 0x84, 0xC4, 0x35, 0xB5, 0xE5, 0xFE, 0x83, 0xAB, 0x8D,
0xE8, 0x7B, 0x7D, 0x50, 0x8C, 0x16, 0xAD, 0x25, 0x92, 0x53, 0xAF, 0xDE, 0x62, 0xF2, 0x25, 0xAB,
0xD9, 0x7C, 0xD3, 0x97, 0x12, 0x4A, 0x59, 0x27, 0xBC, 0xBD, 0x61, 0x03, 0x10, 0x8D, 0x50, 0x15,
0x1C, 0x5B, 0xA2, 0x11, 0xEA, 0x34, 0xB2, 0x81, 0x16, 0x24, 0x43, 0x28, 0x92, 0x9A, 0x6D, 0x2D,
0x16, 0xCB, 0xB9, 0xD5, 0x35, 0xF8, 0x13, 0x8D, 0x30, 0x24, 0x82, 0x83, 0xC2, 0x60, 0x84, 0x44,
0x2E, 0x39, 0x20, 0x40, 0x68, 0xDE, 0x37, 0xA5, 0xE2, 0x8E, 0x80, 0x16, 0xC9, 0x06, 0x0C, 0x03,
0xA0, 0x0B, 0x41, 0x68, 0xB2, 0xDC, 0x6B, 0x0C, 0xAC, 0x78, 0x97, 0x73, 0x07, 0x43, 0xA3, 0x48,
0x1C, 0xAA, 0xCE, 0x72, 0x64, 0x7D, 0x13, 0x71, 0xD1, 0x4A, 0x12, 0x36, 0xC6, 0xF5, 0x16, 0x84,
0x38, 0x05, 0xC1, 0xC7, 0x06, 0x47, 0x2E, 0x2E, 0x03, 0x14, 0x54, 0xD7, 0x26, 0x9C, 0x15, 0xD2,
0xD4, 0xBE, 0x2B, 0x36, 0x14, 0x9F, 0x87, 0x9C, 0x91, 0x42, 0x0A, 0xA8, 0xB3, 0x9B, 0x2C, 0xFE,
0xC0, 0xA4, 0x58, 0xB9, 0xCD, 0x0C, 0x7D, 0xBA, 0x04, 0x4E, 0xBC, 0x8A, 0x99, 0xAD, 0x3B, 0x3D,
0xD9, 0x42, 0xF9, 0x4B, 0xCC, 0x37, 0xD8, 0xE0, 0x08, 0xEF, 0x3E, 0x4E, 0xB6, 0xB6, 0x21, 0xE4,
0xCD, 0x93, 0xE2, 0x5D, 0xE3, 0x82, 0x94, 0x2A, 0xA4, 0x13, 0x10, 0x22, 0x4F, 0x27, 0x8B, 0x0E,
0xF5, 0x75, 0xD0, 0xBC, 0xDE, 0xFB, 0x4D, 0xD3, 0xFB, 0x8A, 0x93, 0x0D, 0xC9, 0x1F, 0x94, 0x18,
0xD1, 0x99, 0xFF, 0x5F, 0x9C, 0xE1, 0x01, 0x5A, 0x01, 0x79, 0x9F, 0x27, 0xD9, 0x47, 0xB6, 0x94,
0x82, 0xAD, 0x74, 0x01, 0xC5, 0x13, 0x4D, 0x4E, 0x16, 0x60, 0xE9, 0x25, 0x6C, 0xE6, 0x10, 0x73,
0xCC, 0x26, 0x8C, 0xB0, 0x32, 0xA1, 0xE8, 0x89, 0xD9, 0xF5, 0x5F, 0x27, 0xBB, 0x80, 0xC6, 0x21,
0x1B, 0xF1, 0x61, 0x31, 0x05, 0x68, 0x54, 0x19, 0x5E, 0x4D, 0xAC, 0x0F, 0x8A, 0x2B, 0x03, 0xA0,
0x07, 0x33, 0x01, 0x4D, 0xAD, 0x1C, 0x6A, 0x84, 0xDD, 0x6B, 0x3F, 0xCF, 0xB5, 0xCF, 0x3F, 0xBC,
0xB5, 0x1D, 0x46, 0x40, 0xF2, 0xC0, 0x1C, 0xD5, 0x42, 0x84, 0x2D, 0x2C, 0x6A, 0x44, 0x80, 0xF0,
0x19, 0xFB, 0xFE, 0xC6, 0xE7, 0x5F, 0xDB, 0xDF, 0xBD, 0xB6, 0x53, 0x03, 0x90, 0xD3, 0x65, 0xA3,
0xF5, 0x76, 0x70, 0xE0, 0xAD, 0x03, 0x8A, 0x33, 0x35, 0xD7, 0x86, 0x7D, 0xFC, 0x30, 0xA6, 0xA9,
0x0C, 0xFB, 0x9E, 0xDB, 0x01, 0xDD, 0x14, 0xED, 0x05, 0x6F, 0x4A, 0x34, 0x39, 0xB1, 0x0B, 0xDC,
0x9D, 0xC7, 0x03, 0x7A, 0x71, 0x10, 0x77, 0x13, 0x96, 0x63, 0xA8, 0x58, 0x90, 0x11, 0x5F, 0xC4,
0x90, 0x26, 0x94, 0x82, 0x86, 0x7B, 0xFD, 0x12, 0xB2, 0x02, 0x0B, 0x20, 0xEE, 0x55, 0xD6, 0x83,
0x3F, 0xFD, 0x86, 0x5C, 0xC1, 0x38, 0xDC, 0x58, 0x55, 0x7E, 0xAB, 0x3B, 0x7D, 0x75, 0xD0, 0xD2,
0xE7, 0xA6, 0xF0, 0x23, 0x64, 0x4F, 0x89, 0x1A, 0x75, 0xB3, 0x89, 0x9C, 0xBA, 0x72, 0x7A, 0xF0,
0x80, 0x44, 0x00, 0x39, 0xEB, 0x7C, 0x88, 0x2B, 0x95, 0xDC, 0xC7, 0xAD, 0xC7, 0xD2, 0xAF, 0xDA,
0x56, 0xF3, 0xF4, 0x07, 0x9C, 0x3A, 0x32, 0xE9, 0x80, 0xB9, 0xEF, 0xE3, 0x42, 0x2C, 0xD9, 0x7E,
0xCF, 0xA0, 0x5C, 0xCD, 0xAC, 0xC7, 0xDC, 0x7E, 0xC1, 0xA4, 0xA0, 0x1F, 0x32, 0xA8, 0x78, 0x0C,
0xCF, 0x0E, 0x91, 0x36, 0x2A, 0x15, 0x5C, 0x56, 0x9E, 0xBF, 0x7D, 0x82, 0xBA, 0x6E, 0x87, 0x0B,
0x9F, 0x6D, 0x5D, 0x56, 0x78, 0xE1, 0xCB, 0x84, 0xA3, 0xE0, 0x91, 0xF2, 0x2F, 0xD4, 0xED, 0x93,
0xB6, 0x94, 0x6D, 0x40, 0x7E, 0x4A, 0x91, 0x59, 0xB1, 0x05, 0x25, 0x03, 0x9B, 0xF9, 0x84, 0x6A,
0x7B, 0x8F, 0x36, 0xB8, 0x77, 0x3E, 0xC9, 0x10, 0x60, 0xCD, 0x06, 0x62, 0x4B, 0x64, 0xCE, 0x22,
0x1F, 0x83, 0x20, 0x61, 0x17, 0x30, 0x38, 0xE5, 0xA0, 0xAF, 0xA4, 0x14, 0x6B, 0x18, 0x53, 0xBC,
0xBD, 0x98, 0x57, 0xAC, 0xB8, 0x2F, 0x5A, 0xB1, 0xB7, 0x56, 0xEA, 0x0D, 0x1F, 0xBB, 0x75, 0x3F,
0xCC, 0xC7, 0xEA, 0x03, 0x3E, 0xF6, 0xAF, 0x50, 0x29, 0xDA, 0x50, 0x08, 0xDA, 0x86, 0xEE, 0x10,
0xD8, 0x1F, 0x54, 0x73, 0x64, 0xBD, 0xBE, 0x6C, 0x95, 0x99, 0x17, 0x6A, 0xCB, 0x70, 0x31, 0x8B,
0x10, 0x2E, 0xC3, 0xA4, 0x1C, 0xDC, 0x01, 0x9F, 0xE6, 0xE9, 0x42, 0x8C, 0x78, 0xAE, 0x99, 0x00,
0x9A, 0x81, 0x72, 0x05, 0xA4, 0xA7, 0x9A, 0x28, 0x86, 0xF4, 0x18, 0x98, 0xA6, 0xCC, 0x75, 0x89,
0x35, 0xCE, 0xBD, 0x2E, 0x8C, 0x61, 0x2B, 0x0C, 0x4D, 0x9D, 0x9D, 0x81, 0x04, 0xA0, 0x6A, 0x78,
0x87, 0x2E, 0x3D, 0xD0, 0x4B, 0xC5, 0x66, 0x1E, 0x36, 0x14, 0x66, 0xC7, 0xB9, 0x59, 0xDA, 0x08,
0xAB, 0x01, 0xCF, 0xB8, 0x57, 0xE5, 0x2B, 0x64, 0x68, 0x45, 0x86, 0xD0, 0xA9, 0xEE, 0x32, 0x0D,
0xBF, 0x49, 0x20, 0xC4, 0x84, 0x3B, 0xC7, 0xE2, 0xE7, 0x2B, 0xE0, 0xCA, 0xCF, 0xCF, 0x12, 0x87,
0x82, 0x97, 0x05, 0x42, 0xAA, 0xA7, 0xAC, 0xF6, 0x9C, 0xDD, 0xF6, 0xF5, 0x3F, 0x63, 0x28, 0x78,
0x96, 0xD8, 0x66, 0xBD, 0x1D, 0x2E, 0xF6, 0xE7, 0x57, 0xC5, 0x8B, 0xA0, 0x90, 0xFB, 0xEE, 0x58,
0x96, 0x83, 0x67, 0x1B, 0xEF, 0x9D, 0x92, 0xD6, 0x83, 0xD8, 0x6F, 0xA0, 0xBA, 0x5C, 0x5F, 0xAA,
0x22, 0x59, 0x1D, 0xB1, 0x60, 0x98, 0x43, 0xAA, 0xDC, 0x90, 0x94, 0x49, 0x74, 0x2C, 0xD9, 0xAB,
0x99, 0x89, 0x41, 0x30, 0x2B, 0x01, 0x26, 0xD4, 0x94, 0x41, 0x36, 0x21, 0x73, 0x61, 0xF6, 0x4B,
0x20, 0xF0, 0xBF, 0xC1, 0xF9, 0xDC, 0x46, 0xAF, 0x57, 0xA0, 0x83, 0xDB, 0x30, 0xC5, 0x2D, 0x92,
0x77, 0x1B, 0x21, 0xE9, 0xEA, 0xF5, 0x7A, 0x0D, 0xE1, 0x20, 0xBC, 0x1E, 0x33, 0xFE, 0x01, 0xAC,
0x55, 0xF4, 0xA1, 0x0E, 0x94, 0x90, 0xAB, 0x43, 0x73, 0x6D, 0xB1, 0xF4, 0xDE, 0x62, 0x0C, 0x7F,
0x9C, 0x89, 0x7F, 0x56, 0x8E, 0x2F, 0x6C, 0xD5, 0x12, 0x41, 0xBD, 0xE9, 0x7C, 0xF2, 0xE8, 0x0E,
0x71, 0x25, 0x26, 0x0D, 0xCC, 0x87, 0x04, 0xD2, 0x16, 0x42, 0xCE, 0xE0, 0xEB, 0x03, 0xDD, 0xC6,
0xA8, 0x25, 0xDC, 0x1E, 0xD6, 0x95, 0x2C, 0x52, 0xB2, 0x8F, 0xB3, 0x82, 0xB8, 0x8F, 0x0D, 0x38,
0x73, 0x75, 0xA8, 0x93, 0xC4, 0x76, 0xDF, 0x36, 0x6B, 0x09, 0x72, 0x6C, 0x71, 0x9E, 0x2B, 0xFF,
0x0F, 0xFC, 0xD9, 0xA3, 0x2F, 0xC3, 0x98, 0x0E, 0xFD, 0xEB, 0x6C, 0x72, 0xD4, 0x34, 0x9F, 0x65,
0xD6, 0x80, 0xCE, 0x4E, 0x2F, 0xF0, 0x10, 0x96, 0xCD, 0x34, 0x99, 0x22, 0x12, 0x12, 0x48, 0xFA,
0x76, 0xA1, 0x55, 0x79, 0xA0, 0xDB, 0x9A, 0x95, 0x1A, 0x8C, 0x05, 0x19, 0x7E, 0x4A, 0xF0, 0xE9,
0x4F, 0x7F, 0xD7, 0x59, 0x78, 0x09, 0x21, 0x85, 0xCC, 0x00, 0xF7, 0x05, 0xD8, 0xC1, 0x99, 0x63,
0x39, 0x0B, 0x2C, 0x67, 0x0F, 0x2A, 0x39, 0x7B, 0x5B, 0xC3, 0x12, 0xC9, 0x59, 0x44, 0xCE, 0xFC,
0x3D, 0x38, 0x03, 0xCA, 0xE4, 0xE5, 0xA2, 0x8D, 0x66, 0xF1, 0x10, 0x59, 0x9D, 0xE9, 0xE6, 0xC0,
0x36, 0xE5, 0x16, 0x89, 0xD1, 0xA6, 0xF4, 0xC1, 0x1C, 0x0A, 0x3C, 0x6E, 0x33, 0x20, 0x0A, 0x05,
0x3A, 0xD7, 0x39, 0xAC, 0xC3, 0x6D, 0x98, 0xCE, 0x22, 0xD6, 0x05, 0x5E, 0x49, 0x13, 0x6E, 0x89,
0x5C, 0x83, 0x6E, 0xAB, 0xF8, 0xD8, 0x2C, 0x46, 0x7A, 0x38, 0xDD, 0xEE, 0xF1, 0x30, 0xA4, 0x5E,
0x03, 0xBA, 0x6D, 0xC2, 0xCC, 0x34, 0x1D, 0x3A, 0xC0, 0x3C, 0x91, 0x49, 0x01, 0x7F, 0x90, 0x60,
0x3D, 0x66, 0xB9, 0x29, 0xCE, 0x84, 0xDD, 0xB0, 0x6D, 0xE7, 0x9A, 0xAA, 0x90, 0xB7, 0x6F, 0x2F,
0xB2, 0x10, 0x29, 0x94, 0xD9, 0xD8, 0x9C, 0xCB, 0x8D, 0x92, 0x1E, 0xFC, 0xFB, 0x2C, 0x71, 0x07,
0xB2, 0xEA, 0x06, 0x6A, 0xF5, 0x08, 0xFE, 0xED, 0xB0, 0x46, 0x05, 0x06, 0xA4, 0xBC, 0x3C, 0xFE,
0x5B, 0xC3, 0x0C, 0x9F, 0x09, 0x77, 0x79, 0xC8, 0xF0, 0xAD, 0x66, 0x12, 0x46, 0xE5, 0xA9, 0xF3,
0x88, 0xDD, 0x37, 0x94, 0xFA, 0xA8, 0xBB, 0x6B, 0xA6, 0x52, 0x76, 0xE0, 0xF0, 0xF4, 0x51, 0x66,
0xDE, 0x0B, 0x4E, 0xEB, 0xDF, 0xDC, 0x58, 0xFC, 0x0B, 0x90, 0x45, 0xE7, 0x99, 0xBE, 0xC6, 0x87,
0x6D, 0x0C, 0xBB, 0xA3, 0xE2, 0x55, 0x33, 0xA0, 0xF6, 0x60, 0x5B, 0x60, 0x3E, 0x10, 0x5B, 0x83,
0x8C, 0xB0, 0x65, 0x03, 0xF3, 0x26, 0x1B, 0xFB, 0xAD, 0x50, 0x50, 0x7F, 0x64, 0xAC, 0xAB, 0x8C,
0x24, 0xD7, 0x12, 0x44, 0x8F, 0xC8, 0x8E, 0x75, 0x80, 0xFC, 0xD9, 0xAF, 0xCD, 0x47, 0x91, 0xF9,
0x6D, 0xEB, 0x6F, 0xF8, 0x03, 0x7E, 0x28, 0x6D, 0x5B, 0x85, 0x1A, 0x11, 0xCD, 0xB2, 0x26, 0xDE,
0x6A, 0x52, 0x3E, 0x8C, 0x35, 0xE6, 0x86, 0x4A, 0x83, 0x50, 0x10, 0xB9, 0xCE, 0x7B, 0x9B, 0x25,
0xE0, 0xAA, 0x1C, 0x96, 0xA3, 0x0F, 0x6D, 0x0D, 0xB7, 0x7A, 0x42, 0xFC, 0x6E, 0x84, 0xB2, 0xAF,
0x95, 0xAF, 0xEB, 0x7B, 0x12, 0xC5, 0x03, 0xD2, 0x66, 0xE2, 0x61, 0x06, 0xE2, 0xB9, 0x2B, 0x09,
0x3D, 0x04, 0xF9, 0x53, 0xD7, 0x1E, 0x6C, 0x4A, 0x7F, 0x1F, 0x26, 0x81, 0x80, 0xA3, 0xDF, 0x85,
0x8C, 0x10, 0xF7, 0x7B, 0x27, 0x7A, 0x48, 0xEB, 0x1C, 0x10, 0xE7, 0x38, 0x6C, 0x18, 0x28, 0x30,
0x32, 0x0D, 0xB0, 0x6F, 0xE5, 0x4F, 0x55, 0x83, 0xB7, 0xF3, 0xE0, 0x4F, 0x74, 0x72, 0x26, 0x59,
0x67, 0x31, 0x77, 0x7E, 0x0A, 0x88, 0xEA, 0x19, 0xF3, 0xF1, 0x09, 0x35, 0x3D, 0xC6, 0xAE, 0x50,
0x1F, 0x05, 0x5C, 0x9B, 0x7F, 0xA2, 0x42, 0xFC, 0x8D, 0x45, 0xF3, 0xEA, 0x8F, 0x23, 0xF3, 0x36,
0xFC, 0x3F, 0x2B, 0xE6, 0x91, 0x19, 0x1F, 0x39, 0x0E, 0x9F, 0x4B, 0x13, 0xD3, 0x24, 0x62, 0x08,
0x2F, 0x63, 0xF5, 0x4A, 0xDF, 0x13, 0x6C, 0xFB, 0x3E, 0x63, 0x61, 0x3B, 0x1B, 0x49, 0x8A, 0xC0,
0x31, 0x39, 0x97, 0x99, 0x66, 0x88, 0xB9, 0xE0, 0x08, 0x39, 0x51, 0x16, 0x73, 0x7E, 0x9D, 0x61,
0xAB, 0xA2, 0x9A, 0xF5, 0x02, 0x7F, 0xDE, 0xCF, 0x2B, 0x6D, 0x91, 0x4A, 0xD3, 0xBF, 0x20, 0x03,
0x20, 0xB2, 0x4B, 0xB1, 0x78, 0x0E, 0xD3, 0xE8, 0x4C, 0xEA, 0xDD, 0x2D, 0xC4, 0x0C, 0xC7, 0x64,
0xF2, 0x5C, 0x6E, 0x4B, 0xD3, 0xCC, 0x96, 0xB2, 0xCA, 0xBC, 0x7A, 0x01, 0x82, 0x72, 0xF8, 0x81,
0x81, 0xC7, 0x53, 0x96, 0x10, 0x48, 0x7A, 0xD5, 0xAC, 0x47, 0xBB, 0xEF, 0x8B, 0x53, 0x74, 0xAC,
0xA3, 0x80, 0x7B, 0xF7, 0x6E, 0xE1, 0xD4, 0x44, 0xCB, 0xF1, 0x29, 0x99, 0x05, 0xE3, 0x2F, 0x42,
0x11, 0xB1, 0x5D, 0xB5, 0x51, 0x0E, 0x9D, 0xEC, 0xB4, 0xAE, 0x09, 0x2C, 0xA3, 0x45, 0x28, 0xBA,
0xD4, 0xA8, 0xA6, 0x91, 0xE4, 0xA2, 0xED, 0x3A, 0xF0, 0xB8, 0x3D, 0x39, 0x41, 0xE9, 0xC6, 0x8C,
0xC7, 0x34, 0x92, 0x68, 0xE3, 0x85, 0xD3, 0x88, 0x58, 0x07, 0x4D, 0xBA, 0x0F, 0x4E, 0xA5, 0x0B,
0x48, 0xDC, 0x06, 0x26, 0xDD, 0xD3, 0x39, 0xC1, 0x70, 0xF2, 0xE9, 0xA5, 0x56, 0xD6, 0xD9, 0x60,
0x2E, 0x2A, 0x65, 0x4F, 0x1C, 0x8F, 0x56, 0x67, 0xCE, 0xFF, 0x5F, 0x27, 0x02, 0xE1, 0x40, 0x92,
0xAC, 0x2D, 0x64, 0xA5, 0xD6, 0xAF, 0xAC, 0x57, 0xE3, 0xA3, 0x83, 0x24, 0x1E, 0x89, 0x83, 0x16,
0x73, 0x3F, 0xAB, 0x8A, 0xCA, 0xBA, 0xD0, 0x14, 0xBB, 0x2A, 0xB1, 0xFB, 0x9B, 0x19, 0xD9, 0x26,
0x10, 0xA0, 0xCF, 0x13, 0x12, 0x9C, 0x2E, 0x6D, 0x92, 0x60, 0xE0, 0xC2, 0xB4, 0x00, 0x52, 0x7E,
0x91, 0x66, 0x13, 0xA4, 0x32, 0x09, 0xE1, 0x17, 0x2B, 0xC8, 0xF5, 0xD0, 0x46, 0x00, 0x4D, 0xE9,
0x4F, 0x0A, 0x68, 0xA7, 0xC7, 0x7E, 0xEC, 0x41, 0xB3, 0xE1, 0x83, 0x1D, 0x00, 0x00, 0xBA, 0x15,
0x92, 0xE6, 0x25, 0x73, 0x12, 0x2B, 0xF3, 0x2B, 0xDD, 0xD5, 0x01, 0x0D, 0x67, 0xEF, 0x40, 0x65,
0xEF, 0x63, 0x86, 0xCF, 0x56, 0xC3, 0x4E, 0x18, 0x70, 0x02, 0xAA, 0x4E, 0xFE, 0x6E, 0x9B, 0x56,
0xA0, 0x95, 0x94, 0x30, 0xAF, 0x4E, 0x82, 0xDC, 0x7E, 0x60, 0xB1, 0x5C, 0xDA, 0x96, 0x7F, 0xDB,
0x8B, 0x6B, 0xCF, 0x47, 0x19, 0x3C, 0xED, 0x3D, 0x76, 0x84, 0x6D, 0x16, 0x65, 0x6F, 0x99, 0x81,
0x37, 0x19, 0x7A, 0xBD, 0x49, 0xDF, 0x79, 0x1E, 0x2C, 0x95, 0xFE, 0x1F, 0xB0, 0x83, 0x67, 0xAA,
0x20, 0x0D, 0x50, 0x94, 0xE9, 0xF7, 0xB0, 0x97, 0xAC, 0xC7, 0xB6, 0xF7, 0xEC, 0xA5, 0xBE, 0x77,
0x2F, 0xB3, 0x18, 0xCF, 0xE6, 0x57, 0xD4, 0xF7, 0x70, 0xB8, 0x52, 0xBD, 0x23, 0xBA, 0x7C, 0x61,
0xEA, 0xF3, 0xB9, 0xF5, 0x6F, 0x85, 0xF1, 0x30, 0x04, 0x55, 0x7E, 0x90, 0x19, 0x6D, 0x76, 0xC4,
0x1F, 0x94, 0xFA, 0xC5, 0xC7, 0x6C, 0x5C, 0x1F, 0xA3, 0x24, 0x79, 0x3D, 0x8B, 0x37, 0xC5, 0x41,
0x6D, 0x9C, 0x00, 0xD6, 0x60, 0x53, 0xCE, 0x38, 0x80, 0x3D, 0x90, 0x6F, 0xB7, 0xDC, 0xA7, 0x17,
0x4B, 0x6E, 0xD0, 0x72, 0x2D, 0xDE, 0x27, 0xA8, 0xCB, 0x9F, 0x2B, 0x01, 0xEE, 0x6F, 0x2F, 0xE6,
0x21, 0x0A, 0x70, 0x7F, 0xCA, 0xEF, 0x9A, 0x41, 0x0C, 0x8F, 0x13, 0xA3, 0x5A, 0xFB, 0xD1, 0x77,
0x7B, 0x27, 0xE5, 0x01, 0xC8, 0xC2, 0xFB, 0xFA, 0xAF, 0x0F, 0xF2, 0xF4, 0x40, 0x6D, 0xE6, 0xFB,
0x13, 0xFB, 0xF1, 0x6A, 0xDB, 0x28, 0x96, 0x81, 0x50, 0xFE, 0x8E, 0xA9, 0xA6, 0x0A, 0x73, 0x22,
0x01, 0xB7, 0xF3, 0x0B, 0xD7, 0x9C, 0xAE, 0xD4, 0x87, 0x55, 0xAB, 0x8A, 0x36, 0x52, 0x45, 0xA4,
0xD7, 0x0B, 0xBD, 0x7E, 0xB7, 0xF0, 0xCA, 0x2C, 0x77, 0x6B, 0x5D, 0x38, 0xAD, 0x37, 0x3D, 0xD9,
0x7A, 0xD7, 0xB1, 0x5A, 0x4A, 0xD9, 0xCC, 0x0D, 0x44, 0x6D, 0x2C, 0x18, 0x5A, 0xA0, 0x3E, 0x51,
0x90, 0x63, 0x03, 0xDF, 0xD1, 0x1D, 0xDB, 0x3A, 0x8E, 0x14, 0x90, 0x54, 0x9E, 0xE9, 0x2F, 0xD6,
0x00, 0xEF, 0xFB, 0x02, 0xC0, 0x0B, 0x0C, 0xF6, 0x02, 0xC2, 0xBD, 0x31, 0x8B, 0x08, 0x2E, 0x4D,
0xD0, 0xCC, 0x20, 0x67, 0x3A, 0x83, 0x5F, 0x61, 0x3A, 0x18, 0x6D, 0x8F, 0xCB, 0xCA, 0x2F, 0x77,
0xF1, 0x7D, 0xB3, 0x4F, 0x0E, 0xB6, 0x99, 0xEF, 0x5D, 0x67, 0xA3, 0xFD, 0x15, 0x7E, 0x8A, 0x26,
0x86, 0x1C, 0x49, 0xF1, 0x65, 0x2E, 0x6E, 0xA1, 0xB7, 0x85, 0xE2, 0xF6, 0xB2, 0x07, 0x12, 0xFF,
0x72, 0x84, 0xCD, 0xB6, 0xB2, 0x4D, 0xF9, 0x84, 0x0D, 0xCE, 0xAC, 0xAD, 0x67, 0xBF, 0x49, 0xED,
0xDB, 0xDE, 0xFF, 0x01, 0x7C, 0x7C, 0xCB, 0xA4, 0x61, 0x0D, 0xB5, 0x2C, 0x13, 0x5F, 0x23, 0xDA,
0x38, 0x35, 0x5B, 0xDD, 0xEC, 0x31, 0x11, 0x99, 0x2E, 0x81, 0x69, 0xA0, 0x6E, 0x55, 0x12, 0xDA,
0xF2, 0x23, 0xD4, 0x1D, 0x76, 0xC5, 0xDB, 0xA1, 0x28, 0xB3, 0x38, 0x7A, 0x61, 0xA8, 0xD8, 0x98,
0xF9, 0x19, 0x8E, 0xBE, 0xC6, 0x80, 0x4B, 0x6C, 0xED, 0xF1, 0xC1, 0x41, 0x4E, 0xC4, 0xFB, 0xF3,
0xD9, 0xDE, 0xDF, 0x88, 0x27, 0xA2, 0x6E, 0xE2, 0x65, 0xDB, 0x06, 0x45, 0x55, 0x8E, 0xD0, 0x4C,
0xB8, 0x1D, 0xE4, 0x6C, 0xC2, 0xB1, 0x17, 0xC7, 0x96, 0x9C, 0x6D, 0xC7, 0xB5, 0xF6, 0x9B, 0x0D,
0x6A, 0xEE, 0xDC, 0x6D, 0xD5, 0xC6, 0xF3, 0x6D, 0xDF, 0x17, 0x85, 0x6D, 0xEF, 0xF9, 0xE1, 0x19,
0x99, 0xB5, 0xFF, 0xBA, 0x62, 0x5B, 0xA1, 0x84, 0x63, 0xCC, 0x9B, 0x7B, 0x36, 0x06, 0xC0, 0xF4,
0xD4, 0xDF, 0x14, 0xC3, 0xEA, 0x76, 0x31, 0x44, 0x33, 0x31, 0xA0, 0xBC, 0x58, 0xA2, 0x18, 0xFE,
0xC6, 0xDD, 0x2C, 0x0C, 0x62, 0xF0, 0x3F, 0x87, 0x18, 0xFE, 0x03, 0xCD, 0x5B, 0x3D, 0x70, 0xDD,
0x56, 0x76, 0xBE, 0x00, 0x28, 0xC1, 0x6B, 0x8C, 0x0D, 0x66, 0xC6, 0xCA, 0x24, 0xE1, 0xDA, 0xD8,
0x22, 0xC5, 0x66, 0xE2, 0x35, 0x1A, 0x17, 0x2E, 0x48, 0x02, 0xB6, 0x33, 0xA3, 0x72, 0x35, 0x13,
0x3E, 0xB1, 0x60, 0xA1, 0xF4, 0xD9, 0x59, 0x6E, 0xE1, 0xC2, 0x99, 0x11, 0x09, 0x64, 0x55, 0xA4,
0xD8, 0x62, 0xD5, 0x78, 0x9B, 0x14, 0xDE, 0x36, 0xB3, 0x85, 0x55, 0xB8, 0x70, 0x41, 0x11, 0xB0,
0x55, 0xB8, 0x48, 0x21, 0xEC, 0x3A, 0x8E, 0x8B, 0x14, 0xC2, 0xDA, 0xD6, 0x38, 0x93, 0x2D, 0x74,
0xB5, 0x02, 0x23, 0xD0, 0x02, 0x70, 0xF3, 0x7D, 0x07, 0x78, 0xBF, 0x24, 0x25, 0x4A, 0x96, 0x9D,
0x7D, 0xF3, 0x1E, 0xF8, 0x1E, 0x7E, 0xEE, 0x3D, 0x7F, 0xF7, 0x9C, 0xEF, 0x9C, 0x73, 0xA9, 0x3C,
0xD3, 0x29, 0xA5, 0x8C, 0x29, 0x94, 0xB2, 0x46, 0x1B, 0xEA, 0x98, 0xD7, 0xD9, 0x9C, 0xC7, 0x96,
0x87, 0xB0, 0xC4, 0xC1, 0x31, 0xFC, 0xFA, 0x4F, 0x15, 0x0E, 0xFE, 0x8F, 0x71, 0xCD, 0xD2, 0x0D,
0xBE, 0xBE, 0xE2, 0xE2, 0x9A, 0x93, 0x47, 0xF8, 0xBA, 0xE7, 0x68, 0x5C, 0x8A, 0x83, 0x14, 0x97,
0x14, 0xAE, 0x85, 0x1C, 0xDD, 0x31, 0x9C, 0x68, 0x4F, 0xE1, 0x9A, 0x9F, 0xAA, 0x28, 0xC6, 0x25,
0xAB, 0x51, 0xB8, 0xDD, 0xCF, 0x1D, 0x3C, 0xD9, 0xD9, 0xA6, 0xB4, 0xB2, 0x2E, 0x33, 0xB8, 0x5B,
0x07, 0x06, 0x57, 0xF0, 0x39, 0x33, 0xBA, 0x30, 0x4F, 0xCA, 0xB9, 0x58, 0xB9, 0xA6, 0xC6, 0xB5,
0x56, 0x19, 0x95, 0x29, 0x3E, 0xFF, 0x02, 0xC7, 0xC0, 0xC7, 0xC2, 0xA3, 0x81, 0x31, 0x2A, 0xB9,
0x9D, 0x80, 0xD6, 0x48, 0xAE, 0xB5, 0x2A, 0x51, 0xD9, 0xAF, 0xCC, 0x7F, 0x47, 0xE6, 0xDD, 0xC6,
0x3B, 0xF4, 0x4A, 0x65, 0xA9, 0x25, 0xDC, 0xAC, 0x2D, 0x50, 0xED, 0x17, 0x97, 0xF1, 0x35, 0x31,
0x31, 0x18, 0x30, 0xC2, 0x61, 0xBC, 0xC0, 0xB7, 0xCB, 0x13, 0x36, 0x79, 0x53, 0x51, 0xC1, 0xDF,
0x14, 0x94, 0xBA, 0xAF, 0xC9, 0x77, 0x88, 0x6B, 0x76, 0xC9, 0x6B, 0x6B, 0x3E, 0x1E, 0x76, 0xF3,
0x7D, 0x7C, 0xAD, 0x5D, 0xF2, 0x0D, 0xDE, 0x94, 0xAD, 0xED, 0x1A, 0x4F, 0x19, 0x0C, 0xEC, 0x1A,
0x10, 0x0B, 0xBE, 0x3D, 0xF0, 0x1D, 0x83, 0x1E, 0x5B, 0x2B, 0xA7, 0x26, 0xCD, 0x61, 0xEE, 0x16,
0xCA, 0x6E, 0xC1, 0xB7, 0x6D, 0xBA, 0xAC, 0xC3, 0xDD, 0x9A, 0xE4, 0xF9, 0xEA, 0xFB, 0x42, 0x9B,
0x6B, 0x2A, 0x10, 0x86, 0x79, 0x97, 0x9E, 0x22, 0xFF, 0xCA, 0x2A, 0x45, 0x8D, 0xC2, 0x2F, 0x59,
0x1F, 0x98, 0x5A, 0x27, 0x27, 0xD6, 0x3D, 0xAA, 0xD4, 0xFB, 0xB8, 0x1C, 0x73, 0x65, 0x6B, 0xB0,
0x02, 0x6D, 0x25, 0x38, 0xB1, 0x43, 0x45, 0x3A, 0x1A, 0xA4, 0xE3, 0x04, 0x78, 0x51, 0x19, 0x99,
0x83, 0x52, 0x4D, 0xAA, 0x02, 0xF2, 0xC5, 0xEB, 0xAD, 0x82, 0x11, 0x80, 0xF3, 0x90, 0xB7, 0xBA,
0x26, 0xB5, 0xB2, 0x36, 0x32, 0xB1, 0x6F, 0x38, 0xAE, 0xFA, 0x80, 0x07, 0xA8, 0x9E, 0x06, 0xC2,
0x03, 0x8D, 0x04, 0x27, 0x0E, 0x78, 0x0C, 0xC4, 0xBA, 0x82, 0x52, 0x9D, 0xC3, 0xD1, 0xA4, 0x18,
0x36, 0x0E, 0xF3, 0x0C, 0xE3, 0x35, 0x96, 0x16, 0x63, 0xCA, 0xC9, 0xA2, 0x9D, 0x35, 0x98, 0x56,
0x7B, 0x87, 0x97, 0x60, 0x66, 0xE4, 0xB0, 0x71, 0xDA, 0xED, 0x6E, 0xD3, 0xDC, 0x33, 0x6F, 0xB4,
0x0E, 0xE6, 0x80, 0x52, 0xAC, 0x7A, 0x7C, 0x33, 0x4C, 0x4A, 0x89, 0x00, 0xAD, 0x6E, 0x50, 0xAE,
0x8D, 0xF3, 0x01, 0x04, 0x9A, 0xE5, 0xCA, 0xC6, 0x39, 0xE7, 0xEA, 0x8C, 0x89, 0x9B, 0x2F, 0x61,
0x0A, 0x8D, 0xDD, 0x5D, 0x6C, 0x20, 0xA5, 0x3D, 0x8C, 0x70, 0x19, 0x23, 0xAC, 0xAE, 0x2B, 0xF5,
0x83, 0x9D, 0x81, 0xDE, 0x66, 0xE1, 0x43, 0x8A, 0xA9, 0x74, 0x0A, 0x27, 0x4A, 0x85, 0x78, 0x08,
0x73, 0xB4, 0x6D, 0x51, 0xDF, 0x2B, 0xE6, 0xD7, 0x32, 0xEE, 0x8B, 0x42, 0x0D, 0xC4, 0xE5, 0xC8,
0x5B, 0xE1, 0xBD, 0x2C, 0x17, 0xAC, 0x0D, 0xE5, 0x99, 0x32, 0x30, 0x5D, 0x90, 0x47, 0x37, 0x73,
0xF7, 0x7E, 0xA1, 0x3E, 0xD7, 0x32, 0xAE, 0x2C, 0x08, 0x45, 0x6E, 0x32, 0x19, 0xD3, 0x36, 0xEF,
0xFC, 0x24, 0xC4, 0xCA, 0xC9, 0x0E, 0x07, 0x52, 0x71, 0x8F, 0x8D, 0x05, 0xE8, 0xDE, 0xC9, 0x55,
0x70, 0x45, 0xAB, 0x5D, 0x55, 0xC1, 0x04, 0x96, 0x4F, 0xE0, 0xE4, 0x32, 0xC6, 0x5A, 0x1D, 0x38,
0x59, 0x7E, 0x62, 0x4E, 0x2C, 0xFC, 0xD6, 0x5C, 0xF6, 0xF6, 0x83, 0xD2, 0xAA, 0xF6, 0x54, 0xED,
0xE7, 0x6F, 0xAB, 0x72, 0x98, 0xF0, 0x89, 0x38, 0xB1, 0x70, 0xD6, 0x69, 0xFA, 0x8F, 0x55, 0x1D,
0xE3, 0x72, 0x16, 0xF4, 0x91, 0xAA, 0x3D, 0x0C, 0x77, 0xF9, 0x1B, 0xE9, 0x03, 0x56, 0xEA, 0x6B,
0x99, 0x71, 0x67, 0xC1, 0xA5, 0x64, 0x1D, 0x6E, 0xFA, 0x7D, 0xE3, 0x34, 0x8D, 0x4A, 0x76, 0xD4,
0xF3, 0x61, 0x4F, 0xF8, 0xC0, 0x45, 0x4C, 0xF5, 0xD1, 0x86, 0xC2, 0xC3, 0x8B, 0x1F, 0x19, 0x53,
0x7A, 0xE6, 0xAA, 0xBA, 0x06, 0x45, 0x36, 0xB8, 0x21, 0xC1, 0x7D, 0x01, 0x94, 0xE1, 0x61, 0x72,
0x5A, 0xDE, 0xC3, 0xCD, 0xE9, 0xD5, 0x75, 0xD5, 0xCF, 0x7D, 0x4A, 0xF2, 0xAD, 0x19, 0xF2, 0xAF,
0xBA, 0xEA, 0x25, 0x5B, 0xFB, 0xE9, 0xBA, 0x9F, 0x7B, 0x9F, 0xE5, 0xCA, 0x94, 0xE4, 0x65, 0x2A,
0x39, 0x51, 0x02, 0xDC, 0xA6, 0x09, 0xF2, 0xF0, 0x66, 0xEE, 0x7C, 0x56, 0xD0, 0xCD, 0x3C, 0x4A,
0x09, 0x05, 0x9C, 0x81, 0x55, 0x79, 0x58, 0x11, 0xFB, 0x90, 0x8D, 0x0A, 0xB9, 0x4E, 0x3C, 0x72,
0x61, 0xEB, 0x59, 0x01, 0xFD, 0xAD, 0xE9, 0xB0, 0xBE, 0x0D, 0xDC, 0xCE, 0xCA, 0xC1, 0x3F, 0x1A,
0xCA, 0x25, 0xC9, 0xE9, 0xC4, 0x4B, 0xB1, 0x69, 0x1C, 0xEC, 0xDA, 0xA1, 0x2F, 0x17, 0x81, 0x9D,
0x70, 0xB0, 0x78, 0x8B, 0x5D, 0x8D, 0x9F, 0xF0, 0x0B, 0x1C, 0xA2, 0xD4, 0x39, 0xD8, 0xA2, 0xDB,
0x83, 0x7B, 0x48, 0xCC, 0xD7, 0x9C, 0x6A, 0x45, 0xBF, 0x0A, 0x0A, 0x73, 0xAD, 0xCE, 0x66, 0x2E,
0x16, 0x6B, 0xF3, 0x12, 0xBD, 0xC4, 0x5B, 0x60, 0xE1, 0x43, 0x2E, 0xE9, 0xB3, 0x60, 0xB3, 0xC1,
0x92, 0x36, 0x9A, 0x11, 0x25, 0xB7, 0xE8, 0xDD, 0xC0, 0x5C, 0x03, 0x99, 0x3A, 0x1A, 0x34, 0xFB,
0x39, 0x7E, 0xD1, 0x31, 0xD0, 0x33, 0x70, 0xA2, 0x0A, 0xA7, 0x20, 0xFF, 0x08, 0xAB, 0x1E, 0x6E,
0x3C, 0xBA, 0x9D, 0x54, 0x98, 0xED, 0x0F, 0x70, 0x93, 0x87, 0x41, 0x05, 0xB6, 0xA0, 0xC8, 0x4C,
0xA4, 0x7B, 0xB0, 0x05, 0x97, 0x83, 0x41, 0x49, 0x9A, 0x3B, 0x65, 0xA6, 0xE5, 0x61, 0x77, 0xF3,
0x60, 0x83, 0x34, 0x36, 0xC3, 0x81, 0xE7, 0xA6, 0x87, 0xDD, 0x39, 0x06, 0x85, 0xB7, 0xA0, 0x70,
0x0E, 0x2E, 0x9A, 0x38, 0xA2, 0xC0, 0x32, 0x8A, 0x0E, 0x92, 0xC5, 0x4D, 0x7F, 0x0E, 0x65, 0x9C,
0x4B, 0x2E, 0x28, 0x1F, 0x83, 0xC0, 0xBD, 0x0D, 0x5A, 0xA7, 0x9B, 0x02, 0xD1, 0xDB, 0x0F, 0xB4,
0xE2, 0xE8, 0xE6, 0xA2, 0x81, 0x21, 0xF8, 0xF9, 0x2E, 0x86, 0x82, 0x33, 0x6B, 0xC8, 0x0F, 0xC5,
0x95, 0x93, 0x1D, 0xF2, 0x45, 0x6E, 0x10, 0x35, 0xC3, 0x9C, 0xCC, 0x38, 0x08, 0x1B, 0x5A, 0x78,
0xA1, 0x2B, 0x4E, 0x60, 0x13, 0x8B, 0xF1, 0x12, 0xB1, 0xC7, 0xFC, 0x16, 0x9F, 0xCA, 0x39, 0x18,
0xD1, 0x81, 0x7B, 0x31, 0xE2, 0x44, 0x81, 0x51, 0x97, 0xC5, 0xF9, 0x4E, 0x28, 0xC0, 0xF3, 0xA0,
0xA9, 0x54, 0x2D, 0x9E, 0x1F, 0x48, 0x52, 0xC3, 0x1D, 0x56, 0x81, 0x13, 0x15, 0x4E, 0xAC, 0x61,
0x8C, 0x6D, 0x0F, 0x83, 0x7D, 0x8C, 0x4F, 0xE9, 0x1A, 0x04, 0x6C, 0x13, 0x9F, 0x1B, 0xCD, 0x04,
0xCD, 0xDE, 0x08, 0x31, 0x98, 0x57, 0xFA, 0x5F, 0x94, 0x56, 0x47, 0x69, 0xF7, 0xAF, 0x4F, 0x47,
0x7F, 0xAF, 0xC5, 0xC4, 0x11, 0x78, 0x5C, 0x58, 0x98, 0xB9, 0xFD, 0x53, 0xDC, 0x16, 0x6F, 0x77,
0x74, 0x87, 0xB1, 0x5A, 0x55, 0x3F, 0x93, 0x90, 0x67, 0x31, 0x52, 0x06, 0xA4, 0x6A, 0xEA, 0xCF,
0x68, 0x79, 0x2D, 0x0C, 0x1B, 0x12, 0x1D, 0x6D, 0x92, 0xF4, 0xF7, 0x41, 0xD8, 0x8B, 0x24, 0x6C,
0x9E, 0xD2, 0x41, 0x43, 0xCA, 0xFF, 0x74, 0xA4, 0xE6, 0x99, 0xCB, 0xD5, 0x8B, 0x94, 0x61, 0x0C,
0x19, 0x16, 0xD1, 0xE8, 0xA2, 0x86, 0xCE, 0x9B, 0x84, 0x60, 0xC4, 0x22, 0x5E, 0x71, 0x54, 0xEB,
0xE6, 0x81, 0x29, 0x24, 0x52, 0xCC, 0x39, 0x05, 0x83, 0x31, 0xF5, 0xBE, 0xEA, 0xD6, 0x55, 0x70,
0x27, 0x76, 0x06, 0x4E, 0xDA, 0xD1, 0x88, 0x4B, 0xAA, 0x10, 0x5C, 0x90, 0xA4, 0xCA, 0xEF, 0x2E,
0x16, 0xB8, 0xED, 0x2C, 0x84, 0x87, 0x68, 0x2E, 0xDE, 0x45, 0x51, 0xB9, 0xC1, 0x3C, 0x98, 0xB0,
0xA8, 0x04, 0x72, 0x02, 0x11, 0x5F, 0x82, 0x12, 0x6C, 0x72, 0xF2, 0x16, 0xC8, 0x5A, 0x9A, 0xA5,
0x53, 0x89, 0x12, 0x68, 0x38, 0x11, 0x90, 0xD8, 0x8C, 0x12, 0xE4, 0x8E, 0xF7, 0x45, 0x09, 0xE4,
0xA4, 0x1D, 0x6D, 0xC1, 0x13, 0x99, 0xBB, 0x86, 0xB7, 0x9E, 0xE0, 0xD6, 0x46, 0x58, 0x48, 0x0D,
0xC6, 0xFB, 0xA8, 0x76, 0xEA, 0x5A, 0x25, 0xD7, 0xA9, 0x64, 0x79, 0x1D, 0x8C, 0x36, 0xE6, 0xDC,
0x5A, 0x74, 0xB8, 0x75, 0x05, 0xF8, 0x6C, 0xC5, 0xA4, 0x14, 0x0A, 0x25, 0x9D, 0x42, 0x4A, 0x63,
0xFA, 0x9E, 0xC3, 0xEC, 0xF6, 0xBC, 0xA4, 0xDB, 0xD1, 0x46, 0x2F, 0x69, 0x5A, 0xCD, 0x82, 0xA4,
0x9F, 0xC3, 0x09, 0x6F, 0x90, 0xF4, 0xA8, 0x9A, 0x48, 0xBA, 0x0F, 0xFE, 0xF5, 0xE0, 0xFA, 0xA2,
0x21, 0xEC, 0xDB, 0x44, 0x37, 0x8C, 0xF9, 0xF4, 0xC0, 0x22, 0x6C, 0xAB, 0xC5, 0x5A, 0x7D, 0x0F,
0xC2, 0x2E, 0xD4, 0x40, 0xAD, 0x19, 0x8D, 0x00, 0x31, 0x09, 0xA6, 0x12, 0xF0, 0xD9, 0x8E, 0x7E,
0x0D, 0x96, 0xCF, 0x82, 0x6B, 0xBB, 0x12, 0x87, 0x3B, 0x78, 0xB8, 0x03, 0x08, 0xB8, 0xC4, 0x50,
0x76, 0xEE, 0xE4, 0xB2, 0x1C, 0xFD, 0x1B, 0x60, 0x0E, 0x7E, 0x42, 0x05, 0x7A, 0x3E, 0xC0, 0x3C,
0x96, 0x35, 0x75, 0x8F, 0x63, 0x4D, 0xAE, 0x7A, 0xD1, 0xD6, 0x81, 0x5A, 0xF7, 0x63, 0xF7, 0x56,
0x4E, 0x8C, 0x01, 0x23, 0x51, 0x13, 0x88, 0x71, 0xE6, 0x02, 0x7C, 0x56, 0x0E, 0x4C, 0x1B, 0xA6,
0xD1, 0x2F, 0x53, 0xF7, 0xC1, 0x02, 0x83, 0x53, 0x07, 0xED, 0x98, 0x77, 0x3E, 0x00, 0xBC, 0xB3,
0xB2, 0x71, 0x38, 0x11, 0xEA, 0x7D, 0x1E, 0x08, 0xA3, 0xFC, 0x8F, 0x70, 0xD8, 0xB3, 0x11, 0xDB,
0x62, 0x6B, 0x56, 0xDD, 0x1E, 0x22, 0x8E, 0x2D, 0x9E, 0xF4, 0xF6, 0x56, 0xE9, 0x92, 0x40, 0x50,
0xBB, 0x46, 0x47, 0x7E, 0x4D, 0x20, 0xD7, 0xCE, 0xD8, 0xAD, 0x93, 0x45, 0xE1, 0x04, 0x2C, 0xF9,
0xE6, 0x3E, 0x5D, 0xE9, 0x4D, 0x10, 0x0A, 0xBA, 0xC0, 0x68, 0xC2, 0xEB, 0x30, 0xDF, 0xC8, 0x02,
0x36, 0x6C, 0x2C, 0xF3, 0x75, 0xA6, 0x69, 0xB9, 0x70, 0x50, 0xF0, 0x95, 0xB2, 0x3C, 0x38, 0x58,
0x84, 0xD9, 0x77, 0x31, 0x56, 0x05, 0xB1, 0x95, 0x6B, 0x80, 0x55, 0xDF, 0x9F, 0x8D, 0xA6, 0x1B,
0x20, 0xC3, 0xD0, 0xD8, 0xE0, 0xA4, 0x96, 0xA0, 0xCE, 0x34, 0xC2, 0x98, 0xFC, 0x84, 0x69, 0x90,
0xFB, 0xB7, 0x33, 0x68, 0x17, 0x72, 0x05, 0xB9, 0xE1, 0x40, 0x48, 0xF4, 0xE9, 0x06, 0x81, 0x6B,
0x89, 0x67, 0x6A, 0xB8, 0xA7, 0x06, 0x26, 0x82, 0x40, 0x6C, 0xD5, 0x00, 0x93, 0x3A, 0x7B, 0x27,
0x2B, 0x68, 0x6B, 0x0C, 0xA8, 0xEA, 0x0C, 0x80, 0x0E, 0x7C, 0x05, 0x66, 0xEE, 0x2E, 0x81, 0x0C,
0x43, 0x9D, 0x64, 0xE9, 0x22, 0x74, 0xB0, 0xCC, 0x21, 0xC1, 0x69, 0x07, 0x2F, 0x7F, 0xB1, 0x46,
0x8C, 0xB0, 0x4B, 0xB0, 0xEC, 0xA6, 0x18, 0xF5, 0x39, 0xE6, 0x19, 0xCB, 0xB2, 0x32, 0xF7, 0xC6,
0xF8, 0x73, 0x10, 0x87, 0x6D, 0xDA, 0x06, 0xDE, 0x92, 0x00, 0x38, 0x22, 0x4C, 0x6E, 0x02, 0x02,
0x80, 0x08, 0x4A, 0xCC, 0x93, 0x02, 0xD7, 0x93, 0xEE, 0xBD, 0x86, 0xB6, 0xA3, 0x11, 0x8A, 0xBF,
0x94, 0x69, 0x9C, 0xDC, 0x83, 0xD6, 0xC2, 0xDE, 0x67, 0x21, 0xB0, 0x28, 0x4B, 0x9D, 0x24, 0x85,
0xBF, 0x83, 0x14, 0xF2, 0xD3, 0x4A, 0xC1, 0x7B, 0x94, 0x14, 0x44, 0x95, 0xE2, 0x67, 0x7C, 0x7D,
0xD4, 0xD1, 0x8C, 0x5F, 0x76, 0x2F, 0x85, 0x16, 0x52, 0xD8, 0xAC, 0x2D, 0x1A, 0x2B, 0x38, 0xF5,
0x63, 0x8C, 0xFA, 0x32, 0xA5, 0xA0, 0x8E, 0x95, 0x82, 0x43, 0x29, 0x78, 0xA7, 0x96, 0x02, 0xC7,
0x88, 0xF2, 0xFE, 0xB3, 0x48, 0xC6, 0xA9, 0xED, 0xA0, 0x7C, 0x7C, 0x3B, 0x78, 0x22, 0xDE, 0x2C,
0xF2, 0xE6, 0x3C, 0x8E, 0x86, 0x87, 0xA5, 0xE7, 0x4D, 0x06, 0x59, 0x9F, 0xAC, 0x21, 0xD5, 0x27,
0x13, 0x5E, 0xDA, 0x4F, 0x36, 0xE1, 0x60, 0x10, 0x88, 0x9F, 0x7E, 0x37, 0x0B, 0x42, 0x9D, 0x15,
0xA9, 0x13, 0x2E, 0x82, 0x35, 0xE1, 0x33, 0x14, 0x0F, 0x16, 0x90, 0x30, 0x26, 0x1F, 0x6A, 0xD6,
0xF3, 0xE5, 0x9E, 0x39, 0x80, 0xE8, 0x42, 0x38, 0x78, 0x91, 0x4D, 0x23, 0xB9, 0x37, 0xA1, 0x8C,
0xF0, 0x27, 0xC9, 0xF8, 0xC2, 0x69, 0x33, 0x84, 0x55, 0x88, 0x05, 0x91, 0xEF, 0xD2, 0x23, 0xEE,
0x9E, 0x9E, 0x46, 0x46, 0x00, 0x81, 0x27, 0x26, 0x65, 0xEE, 0xC7, 0xA2, 0x82, 0xD5, 0x0A, 0x8D,
0x4C, 0x27, 0x6F, 0xE2, 0xB6, 0x90, 0x8A, 0x5A, 0x9D, 0xE4, 0x10, 0x3D, 0x68, 0xA6, 0x4D, 0x87,
0x3C, 0xFC, 0x55, 0x33, 0x24, 0x3A, 0x47, 0x0F, 0xF0, 0xA3, 0xAA, 0x49, 0x5A, 0x7A, 0x68, 0xF8,
0x29, 0x70, 0x92, 0x02, 0x56, 0x04, 0x04, 0x81, 0xFE, 0xA9, 0x0F, 0x9E, 0xC9, 0x13, 0x04, 0x81,
0x9C, 0x04, 0xE2, 0xC7, 0x21, 0x83, 0xE8, 0x9C, 0x4C, 0xCC, 0xF4, 0xA5, 0x9F, 0xAE, 0x4C, 0xB2,
0x36, 0x13, 0x99, 0xAC, 0x68, 0x9A, 0xF1, 0xD8, 0x15, 0x9F, 0x69, 0x37, 0x58, 0x2C, 0xD0, 0x4A,
0x80, 0xDC, 0xD8, 0x3B, 0xF3, 0x99, 0x6D, 0x40, 0xD8, 0x5B, 0xC4, 0x03, 0x87, 0x97, 0x80, 0xF2,
0x60, 0x8B, 0xCE, 0x31, 0x30, 0xF7, 0x84, 0x53, 0x09, 0x1C, 0xF8, 0x17, 0x4C, 0x0A, 0xF2, 0x25,
0x04, 0x96, 0x3B, 0x5D, 0xF6, 0x71, 0xF7, 0x0F, 0xEB, 0x13, 0x63, 0x78, 0xD7, 0x88, 0x1D, 0x0A,
0xB5, 0x0F, 0xFD, 0x22, 0x24, 0x87, 0x6F, 0x6C, 0x57, 0x66, 0xBB, 0xFB, 0x79, 0x3B, 0x54, 0x23,
0xCE, 0xC4, 0x89, 0x0E, 0x4F, 0x7E, 0xD0, 0x33, 0x5F, 0x99, 0x26, 0x82, 0xB5, 0x99, 0x0F, 0xA7,
0x25, 0x25, 0x87, 0xAB, 0xA0, 0x12, 0xFA, 0x94, 0x90, 0x7B, 0x9A, 0xAF, 0x89, 0xB9, 0x01, 0x45,
0x9F, 0x1B, 0x9D, 0x37, 0x26, 0x21, 0x5C, 0xE8, 0x5F, 0x1B, 0x96, 0xC9, 0xC3, 0x47, 0xE8, 0xF8,
0x77, 0xA6, 0x5D, 0x56, 0x97, 0x55, 0x52, 0xEC, 0x20, 0xE2, 0x37, 0x03, 0xA2, 0x7C, 0x5C, 0xBE,
0x97, 0x61, 0xA4, 0xFD, 0x08, 0xED, 0x38, 0x71, 0xBF, 0x10, 0x34, 0x9E, 0x39, 0xF1, 0x41, 0xF8,
0x26, 0x52, 0xFA, 0x19, 0x74, 0x76, 0x6A, 0x93, 0xB4, 0x69, 0x88, 0x85, 0x97, 0x62, 0x4D, 0xEC,
0xF1, 0x84, 0xB9, 0xE0, 0x9A, 0x38, 0x28, 0xDD, 0x02, 0x5E, 0xDE, 0x4C, 0x3D, 0xEB, 0x23, 0x65,
0x7E, 0x0B, 0x38, 0xBF, 0x96, 0x4C, 0x08, 0xE7, 0x52, 0x8C, 0x91, 0xA4, 0xF0, 0x60, 0x51, 0x8E,
0x61, 0x26, 0x83, 0xB8, 0xFD, 0xAA, 0x3C, 0xF5, 0x5A, 0x09, 0xC1, 0x4A, 0xFB, 0x48, 0x9E, 0xFF,
0xD7, 0xB4, 0xC6, 0xFC, 0x82, 0x70, 0x34, 0x34, 0xC8, 0x17, 0xE4, 0xAA, 0x5C, 0x8B, 0xFA, 0x71,
0xBE, 0xD1, 0x29, 0x80, 0x73, 0x2E, 0x49, 0x2E, 0xD0, 0x3E, 0xC9, 0x16, 0x67, 0x9C, 0x0D, 0xAE,
0xD9, 0xA6, 0x4F, 0x61, 0xE9, 0xD1, 0x2D, 0xAC, 0x2A, 0xCA, 0x7D, 0x6D, 0x54, 0xF4, 0x61, 0x35,
0x8F, 0x85, 0x37, 0x90, 0x79, 0xE9, 0xA0, 0x33, 0x79, 0xA6, 0x23, 0x49, 0xA6, 0x98, 0x54, 0x35,
0x9C, 0xE7, 0xE4, 0x9F, 0x19, 0xC1, 0x73, 0x35, 0x94, 0x92, 0x10, 0x64, 0x14, 0x83, 0x06, 0xF0,
0x91, 0xC7, 0xAA, 0x5C, 0xAC, 0xE8, 0xBF, 0xEC, 0x98, 0x95, 0x3C, 0x07, 0xB9, 0xE3, 0x1F, 0x6B,
0x40, 0xBF, 0x58, 0xCA, 0x8A, 0x83, 0xA5, 0x23, 0x3E, 0xC5, 0x33, 0xF9, 0xF7, 0x5C, 0x32, 0x7E,
0xBA, 0x1F, 0xE0, 0x89, 0x39, 0x73, 0xC3, 0xB7, 0xD7, 0xF6, 0x9C, 0x2F, 0x09, 0x6A, 0x6B, 0xD4,
0x6E, 0xED, 0xFC, 0xBE, 0x8A, 0x6C, 0x5D, 0x3A, 0xE9, 0x98, 0xC3, 0x44, 0xD3, 0x9F, 0x9C, 0x6E,
0x51, 0x31, 0xD7, 0x4D, 0x99, 0x46, 0x16, 0x6E, 0xCB, 0x60, 0x05, 0x37, 0x98, 0x19, 0x88, 0x39,
0x30, 0x44, 0x8D, 0x4C, 0x40, 0x71, 0x70, 0x34, 0xB9, 0x6E, 0x78, 0x60, 0xCA, 0x09, 0xE4, 0x09,
0x0A, 0xC0, 0x29, 0x81, 0x28, 0x0F, 0x11, 0x61, 0xBD, 0x7F, 0x8B, 0x45, 0xDF, 0x3F, 0xF2, 0x6B,
0xC3, 0xDA, 0x70, 0x64, 0xB7, 0x24, 0x3E, 0x24, 0xED, 0xAC, 0xB1, 0x35, 0xAC, 0x18, 0x33, 0xF8,
0x12, 0xE1, 0x07, 0x35, 0x26, 0x12, 0xC5, 0x4D, 0x82, 0x6B, 0xFF, 0x4B, 0x14, 0x2A, 0xA1, 0xBB,
0xAF, 0x3C, 0x68, 0x56, 0x02, 0x88, 0x69, 0xF1, 0x7D, 0x4B, 0x0F, 0x4E, 0xD2, 0x39, 0xE6, 0x4B,
0x48, 0x82, 0xB3, 0x12, 0x0E, 0x8F, 0x79, 0x31, 0x74, 0xA1, 0xAF, 0xE3, 0x12, 0xC2, 0xB0, 0x63,
0xCA, 0xE1, 0xCB, 0x5D, 0x10, 0x14, 0xB9, 0x15, 0xED, 0x88, 0x61, 0x1E, 0xD1, 0x16, 0x84, 0x21,
0x5B, 0xF0, 0x80, 0xDA, 0x19, 0x38, 0xE4, 0xB5, 0x33, 0x8E, 0xF3, 0xD1, 0x98, 0x10, 0xC2, 0x87,
0x97, 0xB8, 0xDA, 0xB9, 0x64, 0x1C, 0x53, 0x65, 0x7A, 0xA5, 0xC3, 0xD5, 0x7D, 0x4E, 0x9A, 0x02,
0x41, 0x14, 0xE0, 0x9A, 0x50, 0xE2, 0xBA, 0x1A, 0xCF, 0x45, 0xFC, 0xCC, 0x74, 0xCA, 0x25, 0x19,
0x01, 0x2D, 0x38, 0xC9, 0x03, 0xA4, 0x35, 0xFF, 0x62, 0x58, 0x0B, 0x86, 0xAD, 0x08, 0xE1, 0x2E,
0x25, 0x49, 0x19, 0x21, 0x7C, 0x5B, 0xF1, 0x7C, 0x78, 0x46, 0x14, 0x2A, 0xD5, 0x62, 0xFE, 0x7D,
0xCA, 0x13, 0xCB, 0x27, 0x25, 0x26, 0x52, 0xAB, 0xB7, 0x53, 0x4F, 0x07, 0x4D, 0x54, 0x3F, 0xDF,
0xCF, 0xB8, 0x02, 0x3F, 0x62, 0x65, 0xA7, 0xF2, 0x82, 0x63, 0xCF, 0x52, 0xF7, 0xF4, 0x15, 0xDF,
0x0E, 0x7D, 0xFD, 0x8B, 0x4E, 0xCA, 0x1B, 0x3F, 0xC3, 0x48, 0x15, 0x0E, 0x58, 0xEB, 0xB1, 0xE9,
0xBD, 0x69, 0xF4, 0x60, 0x62, 0xF2, 0x54, 0x69, 0x69, 0x75, 0x6D, 0x5C, 0xE1, 0x67, 0x26, 0x1A,
0x22, 0xAB, 0x41, 0x80, 0x34, 0x6F, 0x16, 0x78, 0x88, 0xAA, 0x7A, 0x0D, 0xB7, 0x3D, 0xF3, 0x18,
0x2C, 0xC5, 0x27, 0xE6, 0xE3, 0x2B, 0xFA, 0xB5, 0x4C, 0xAF, 0xAD, 0xE8, 0x1D, 0x47, 0x5F, 0x76,
0xF4, 0xDB, 0x8E, 0xFE, 0x99, 0xBC, 0xD5, 0x29, 0xDF, 0xB0, 0x68, 0xC3, 0x4C, 0xFC, 0xE1, 0xC2,
0x46, 0x68, 0xD0, 0x0E, 0x43, 0xBD, 0x61, 0x71, 0x2B, 0x3E, 0x4E, 0xD8, 0x3F, 0x1A, 0x84, 0xED,
0x42, 0xD8, 0x9B, 0xD3, 0x2C, 0x15, 0xEB, 0x0A, 0x31, 0x04, 0xC2, 0x3C, 0xD1, 0xF9, 0x58, 0x70,
0x7A, 0x86, 0xC8, 0xB8, 0x71, 0x8B, 0xE3, 0x7D, 0x14, 0xF0, 0x13, 0x03, 0x79, 0x60, 0x74, 0x9F,
0xFD, 0xC8, 0xB4, 0xB2, 0x86, 0xE7, 0xBF, 0x7C, 0x04, 0x06, 0xBA, 0xB6, 0xB7, 0x77, 0xBB, 0x1B,
0xDA, 0x2C, 0xFB, 0xAC, 0x5F, 0x8F, 0xEF, 0x21, 0xE5, 0xCC, 0xBE, 0x05, 0xC1, 0xAF, 0x01, 0x4E,
0x6D, 0xE5, 0xA4, 0x54, 0x8A, 0x10, 0x80, 0x83, 0x99, 0x56, 0xDB, 0x47, 0xBC, 0xD7, 0x35, 0x20,
0x5D, 0x1F, 0x88, 0x28, 0x86, 0x00, 0x12, 0x8D, 0x5C, 0xFB, 0x99, 0x45, 0xF7, 0x16, 0x9A, 0x2B,
0x52, 0x73, 0x50, 0x7F, 0x3D, 0x6D, 0x33, 0x24, 0x9C, 0xD1, 0x93, 0x2E, 0x43, 0x12, 0x1F, 0xD3,
0xEC, 0x41, 0xBA, 0x4D, 0x24, 0x58, 0xE1, 0xE1, 0xAB, 0x91, 0x68, 0x82, 0x25, 0xD6, 0x9C, 0x95,
0x08, 0x18, 0xD5, 0x2D, 0x89, 0x45, 0x21, 0x8B, 0x84, 0x4D, 0x6F, 0x63, 0x89, 0xD8, 0xDA, 0x75,
0xB1, 0xB9, 0x46, 0x6C, 0xAF, 0xE6, 0x69, 0xBB, 0xEA, 0x2F, 0x4B, 0xE4, 0xFA, 0x82, 0xA7, 0xBD,
0x5B, 0x52, 0x2C, 0x65, 0xF4, 0xA4, 0xE7, 0x66, 0xDF, 0x87, 0x48, 0x10, 0x61, 0x19, 0xF0, 0xA2,
0x87, 0x7A, 0x53, 0x5A, 0x9E, 0x1F, 0x37, 0xDA, 0xDC, 0xB1, 0x33, 0x9A, 0xE4, 0x1B, 0x93, 0xD7,
0x19, 0x35, 0x52, 0x6E, 0x47, 0xCF, 0xF7, 0x00, 0x8B, 0xC7, 0xED, 0x14, 0x92, 0x87, 0xC2, 0x7A,
0x9C, 0x80, 0x2A, 0xF8, 0x37, 0x11, 0xAF, 0x56, 0x83, 0x32, 0x72, 0x1D, 0x2D, 0x70, 0x9D, 0x7F,
0x2B, 0x5C, 0x17, 0xC2, 0x75, 0xBC, 0xC8, 0xB5, 0x5B, 0x4C, 0x7B, 0x52, 0xFD, 0x25, 0xA9, 0x7D,
0xB8, 0x72, 0x62, 0x8D, 0xEB, 0x38, 0x3E, 0x17, 0x5B, 0xC0, 0x17, 0x85, 0xDF, 0xB1, 0xEE, 0x4B,
0xD4, 0xEF, 0x54, 0xE3, 0xE2, 0xEF, 0xA9, 0xF8, 0xB6, 0x19, 0xDC, 0x2E, 0x99, 0xD7, 0xC5, 0x5C,
0xC7, 0xAF, 0x70, 0x12, 0x80, 0x9A, 0xB1, 0xDB, 0x0F, 0x86, 0xF0, 0xA3, 0x9E, 0xA5, 0xF7, 0x57,
0xEB, 0x12, 0xA4, 0x76, 0x05, 0x3D, 0xF5, 0x05, 0x99, 0x2C, 0x9F, 0xF4, 0xAF, 0xFE, 0x94, 0x8C,
0x07, 0x61, 0x4A, 0x7B, 0x58, 0x9C, 0x25, 0x22, 0x99, 0xFB, 0x49, 0x39, 0xC4, 0x4E, 0x29, 0x10,
0xCC, 0x26, 0xA3, 0x4F, 0xD5, 0x78, 0xCE, 0xC8, 0x88, 0xBE, 0x28, 0xAF, 0xEF, 0x92, 0x0E, 0x14,
0xC9, 0xEA, 0xEE, 0xE5, 0xC9, 0x06, 0x70, 0xDF, 0xFB, 0x7B, 0xC1, 0xDA, 0x50, 0xAB, 0xA2, 0xC4,
0xBF, 0x50, 0xE6, 0x0E, 0x6B, 0x37, 0xA2, 0x47, 0x26, 0xCD, 0x6E, 0xDF, 0xE0, 0x93, 0xFE, 0xA2,
0x0C, 0xD1, 0x0C, 0x2D, 0x3C, 0xE7, 0xD1, 0x17, 0x42, 0xC3, 0xCA, 0x5F, 0x88, 0x64, 0xAE, 0x39,
0x51, 0x0B, 0xB3, 0xC6, 0x1C, 0x4F, 0xB5, 0xB0, 0xAB, 0x7A, 0xB8, 0x37, 0xD1, 0x02, 0x3D, 0x1F,
0x73, 0x27, 0xB9, 0x5C, 0xF2, 0xB4, 0xF7, 0x89, 0x88, 0xE0, 0x26, 0x65, 0x10, 0x30, 0x94, 0x28,
0x01, 0xE0, 0x2A, 0x12, 0x2D, 0x24, 0xA2, 0x05, 0x33, 0xB1, 0xD8, 0x25, 0xC2, 0x50, 0x75, 0x8D,
0x66, 0xE5, 0x1C, 0x08, 0x50, 0x95, 0x0C, 0x8F, 0x2D, 0x15, 0x5A, 0x70, 0xF2, 0xB9, 0xA9, 0xC8,
0x39, 0xA5, 0x4E, 0xF3, 0x25, 0x4F, 0x8F, 0xFA, 0x84, 0x70, 0xF0, 0x89, 0x19, 0x3A, 0xBC, 0x7D,
0x73, 0x68, 0x7F, 0x80, 0xA3, 0xB0, 0xCC, 0xA4, 0x90, 0x38, 0x29, 0x55, 0xFF, 0x90, 0x22, 0x8D,
0x4C, 0x7D, 0x6C, 0x35, 0x48, 0xB1, 0x3E, 0xCD, 0xEA, 0x06, 0xE0, 0xF2, 0x08, 0xA9, 0x06, 0x6C,
0x4A, 0xB3, 0xFE, 0x51, 0x03, 0x21, 0x59, 0x0D, 0x47, 0xED, 0xAE, 0x73, 0x78, 0x89, 0x1F, 0xC7,
0x1D, 0xB8, 0x6C, 0x76, 0xB9, 0x54, 0x5A, 0x79, 0x22, 0x64, 0xC5, 0xD2, 0x67, 0x0F, 0xC8, 0xC5,
0x78, 0x90, 0x01, 0xD7, 0xD5, 0x8A, 0xB9, 0x2A, 0xC8, 0x97, 0x1D, 0x8E, 0xB9, 0xBE, 0x80, 0x54,
0xA3, 0x31, 0x7B, 0xEA, 0x61, 0xF5, 0xEE, 0xAA, 0xE4, 0x06, 0x18, 0xBB, 0x14, 0x33, 0x12, 0xB0,
0x44, 0x4B, 0xFD, 0xF8, 0x46, 0xE6, 0xB0, 0xBE, 0x86, 0xC9, 0x7F, 0x52, 0xAB, 0xC4, 0x6B, 0xB7,
0x20, 0x61, 0x52, 0x7B, 0x55, 0xA9, 0x17, 0xD4, 0x0F, 0xE8, 0x06, 0x10, 0xC0, 0xA3, 0x5F, 0x95,
0x83, 0x50, 0xED, 0xEE, 0xFF, 0x8F, 0x47, 0xAE, 0x38, 0x36, 0xE9, 0xA3, 0xD7, 0xB5, 0x6C, 0x1F,
0x60, 0xF1, 0x6F, 0xA6, 0x47, 0x7F, 0xE6, 0x82, 0xB4, 0xE8, 0x33, 0x28, 0xBA, 0x74, 0x61, 0x6A,
0xCE, 0x41, 0xA5, 0xBC, 0x3B, 0x7D, 0x9F, 0x90, 0x13, 0x09, 0xCB, 0x85, 0x0A, 0xDE, 0xCB, 0xD5,
0x75, 0x64, 0x69, 0x3A, 0xFB, 0x34, 0x63, 0x53, 0x5B, 0x85, 0x6C, 0xF0, 0x3E, 0x43, 0x5E, 0xD7,
0xB9, 0x35, 0xA2, 0x73, 0xD9, 0x8B, 0x0A, 0x71, 0x63, 0x91, 0x51, 0xCB, 0xD5, 0xAC, 0xCB, 0xFC,
0xCE, 0x58, 0x7D, 0xD6, 0x4E, 0xD5, 0x9A, 0x9F, 0xDA, 0xD5, 0x75, 0xE5, 0x5F, 0xD1, 0x6A, 0x2F,
0x54, 0x4E, 0xAE, 0xD5, 0x92, 0xF5, 0xCD, 0x59, 0x65, 0x51, 0xCC, 0xE4, 0x6C, 0x50, 0x19, 0x78,
0xE7, 0x77, 0x12, 0x86, 0x7E, 0x2E, 0xCE, 0xD5, 0x80, 0xCB, 0xD5, 0xB9, 0x51, 0xC9, 0x22, 0x4F,
0xC4, 0xEE, 0x89, 0xB6, 0x07, 0x0C, 0x32, 0xDA, 0xF0, 0x65, 0xD7, 0x41, 0x21, 0xD6, 0xDE, 0xCC,
0xA1, 0x93, 0xE1, 0xB6, 0xFE, 0x19, 0x47, 0x06, 0xF0, 0x43, 0xBA, 0x60, 0x4B, 0x67, 0xD2, 0xDF,
0xB3, 0xCD, 0xED, 0x64, 0xB4, 0x59, 0xCA, 0xA4, 0x2D, 0x84, 0x28, 0xA5, 0xED, 0x73, 0x31, 0xAD,
0x33, 0xEB, 0x6C, 0x70, 0x62, 0xCC, 0x3D, 0x9C, 0xDA, 0xB7, 0x4C, 0xED, 0xD4, 0xEB, 0x0A, 0x28,
0x23, 0x09, 0x63, 0x64, 0x34, 0x2C, 0x59, 0x41, 0xDA, 0xF7, 0xE8, 0x8A, 0x4D, 0x03, 0xAC, 0x71,
0x30, 0xDA, 0x10, 0xA4, 0x41, 0xEF, 0x07, 0x38, 0xC1, 0x1D, 0x0F, 0x9C, 0x38, 0x06, 0xDE, 0x57,
0xFE, 0xE1, 0xB6, 0x39, 0xDC, 0x4A, 0x8D, 0x01, 0x24, 0x2C, 0xCE, 0x76, 0xF1, 0x0A, 0x04, 0xDA,
0x17, 0x87, 0x25, 0xB8, 0x64, 0x4C, 0x57, 0xA5, 0x43, 0x44, 0x8D, 0xFE, 0x8D, 0x3A, 0xAE, 0xD3,
0xAA, 0xD9, 0x92, 0x14, 0x48, 0xD3, 0x49, 0xBB, 0xB5, 0x77, 0x7F, 0xE3, 0x03, 0x73, 0x10, 0x9B,
0x44, 0x6C, 0x53, 0xBC, 0x18, 0xDD, 0x31, 0xE2, 0x21, 0x33, 0x1E, 0x24, 0x0D, 0x09, 0x28, 0x08,
0xD9, 0x74, 0xE0, 0xC8, 0x28, 0xD2, 0xB4, 0x8D, 0x8A, 0x90, 0xC0, 0x09, 0xD0, 0xD2, 0xEE, 0x83,
0xE0, 0x5B, 0x22, 0x27, 0x64, 0x33, 0x41, 0xCA, 0x20, 0xE1, 0x4C, 0xE2, 0xC4, 0x85, 0x33, 0xE7,
0xBB, 0xE0, 0x20, 0x7B, 0xB7, 0x75, 0x3A, 0x8B, 0x9B, 0x28, 0x1E, 0x96, 0xA9, 0x5A, 0x19, 0x01,
0x6B, 0xF1, 0x64, 0xA4, 0xC7, 0x63, 0xD2, 0xF7, 0x85, 0xF4, 0x98, 0xA4, 0xE7, 0xC7, 0x91, 0x9E,
0x2F, 0x90, 0x3E, 0xF4, 0xBA, 0xB2, 0x49, 0xCC, 0x59, 0x9F, 0x44, 0x65, 0x2D, 0xCE, 0x36, 0xA8,
0x92, 0xFF, 0xEC, 0xB2, 0xCA, 0xAF, 0x97, 0x9C, 0xFA, 0xE1, 0xD9, 0xF6, 0x59, 0xD3, 0x0A, 0x25,
0x93, 0x61, 0xC3, 0xFE, 0x0A, 0x1E, 0xBB, 0xAC, 0xD4, 0xCB, 0x54, 0x1D, 0xF2, 0x34, 0x37, 0x17,
0xE3, 0xE2, 0x6A, 0x69, 0x49, 0x02, 0xD7, 0xBC, 0xEC, 0x30, 0x90, 0xC4, 0xEE, 0xDB, 0xD2, 0x60,
0x75, 0xB2, 0x06, 0x97, 0xD4, 0xB2, 0x9B, 0xBE, 0xA2, 0xAA, 0x50, 0x85, 0x3F, 0x8E, 0x1D, 0x82,
0x01, 0x90, 0x5D, 0x3C, 0x89, 0x06, 0x59, 0xA9, 0xC8, 0xC6, 0xA5, 0x35, 0x60, 0x2E, 0x86, 0x72,
0x8E, 0x57, 0xCC, 0x58, 0x84, 0x4A, 0xB8, 0xE7, 0xA8, 0xF2, 0x0F, 0xB6, 0x7F, 0x5E, 0xAB, 0x1A,
0xF1, 0xF1, 0x4D, 0xAD, 0xDE, 0x8F, 0xE2, 0x25, 0xC9, 0xF6, 0x39, 0x0A, 0xA4, 0x95, 0xB1, 0x85,
0x55, 0x4A, 0x71, 0xC4, 0x6E, 0x90, 0x4F, 0x7D, 0x9C, 0xAA, 0x66, 0x4F, 0xF9, 0xFF, 0x5E, 0x3A,
0x55, 0xF2, 0x8E, 0x71, 0x89, 0xE8, 0x4D, 0xDF, 0x0E, 0x7B, 0x8E, 0x33, 0xBB, 0x65, 0x2F, 0x0B,
0x7F, 0xDA, 0x3C, 0x36, 0x1D, 0x42, 0x47, 0x6B, 0xDF, 0xD3, 0xCE, 0xCD, 0x62, 0x29, 0xFC, 0x52,
0x85, 0x2D, 0x3C, 0x49, 0x6C, 0x9B, 0x0D, 0x26, 0x02, 0x6C, 0x39, 0xDF, 0xCE, 0x12, 0x53, 0x87,
0x5D, 0x3C, 0x8E, 0xB8, 0x51, 0x09, 0x77, 0x23, 0xCE, 0x69, 0xC7, 0x2E, 0xAD, 0xA9, 0x13, 0x76,
0xFB, 0x1D, 0x44, 0xE6, 0x62, 0x1D, 0xA6, 0x74, 0x5B, 0xC0, 0x55, 0xDE, 0x9B, 0x95, 0x8A, 0xE1,
0x0C, 0x94, 0x6C, 0x5A, 0x4A, 0x81, 0x14, 0x62, 0xE5, 0x75, 0xFD, 0x2A, 0x0C, 0x6F, 0x80, 0xD4,
0xB7, 0x41, 0x2A, 0x20, 0xC2, 0xBE, 0x8A, 0xCE, 0x1F, 0x5E, 0xD2, 0x98, 0x47, 0x6D, 0x1F, 0xB2,
0x0F, 0x0D, 0x37, 0x1C, 0x69, 0xFB, 0x41, 0xE1, 0xFF, 0x22, 0x6F, 0xFC, 0xF3, 0xF9, 0x73, 0x4F,
0x40, 0xED, 0x53, 0x15, 0x1E, 0xF5, 0x62, 0xFA, 0xAC, 0x66, 0x7D, 0xB2, 0xB7, 0xE3, 0x05, 0x09,
0xB1, 0x11, 0xF2, 0x1E, 0x13, 0xC5, 0x7B, 0x8D, 0xBA, 0x57, 0x59, 0xDE, 0x21, 0x79, 0x74, 0xA1,
0xD8, 0xEC, 0x53, 0x41, 0x2D, 0xF0, 0x6E, 0x87, 0xDB, 0xB7, 0x4C, 0xE7, 0xC9, 0x40, 0x14, 0xBF,
0x56, 0xE2, 0x6B, 0x6D, 0xC1, 0x56, 0x17, 0x04, 0xF2, 0xD6, 0x70, 0xE4, 0x25, 0xBC, 0x99, 0xE9,
0x77, 0x49, 0xE9, 0x87, 0x19, 0xC0, 0x35, 0xEE, 0x73, 0x7B, 0x6C, 0x1E, 0xDE, 0xB2, 0x3E, 0xD1,
0xFE, 0x79, 0xFD, 0x81, 0xF7, 0x55, 0xEE, 0x77, 0x44, 0xA8, 0x7E, 0x3C, 0x15, 0xA9, 0xA1, 0x48,
0xD5, 0x17, 0xDC, 0x20, 0xA2, 0x66, 0x44, 0xFA, 0x93, 0x45, 0x91, 0xD2, 0x73, 0xDF, 0xC1, 0xA7,
0x3B, 0xDC, 0x3C, 0xD8, 0xBC, 0x85, 0x64, 0x7C, 0x0D, 0xB0, 0xCD, 0xB9, 0x05, 0x3E, 0x56, 0x8F,
0xAD, 0x13, 0x9D, 0xEE, 0x8B, 0x8B, 0xA0, 0x60, 0x99, 0xF1, 0x52, 0x20, 0xC0, 0xEA, 0xE1, 0xFE,
0x38, 0xAB, 0xB5, 0xAB, 0x61, 0x8F, 0x8E, 0x90, 0xAC, 0x65, 0x27, 0xDF, 0x34, 0x6F, 0x6F, 0x10,
0x1A, 0x36, 0x0F, 0x2E, 0x9C, 0x98, 0xDB, 0x63, 0x31, 0x77, 0xFF, 0xC6, 0x7C, 0x39, 0xE9, 0xB7,
0xE0, 0xA5, 0x34, 0x5F, 0xA4, 0xE3, 0xC0, 0xC9, 0x9E, 0x24, 0xAE, 0x2F, 0x28, 0xAB, 0xB0, 0x81,
0x65, 0x63, 0xC4, 0xEE, 0x36, 0x8C, 0x25, 0x74, 0x32, 0x06, 0x0D, 0xDE, 0x6D, 0x78, 0x7D, 0xEB,
0xAC, 0xB3, 0xB1, 0xCB, 0x37, 0x40, 0xC8, 0x9F, 0x95, 0xD6, 0xDD, 0xC2, 0xB9, 0x9B, 0x3F, 0x19,
0x97, 0x0F, 0xA1, 0x74, 0xD9, 0xD1, 0xD6, 0x02, 0x15, 0x46, 0x60, 0x20, 0x44, 0xBD, 0x79, 0x10,
0x3F, 0x8C, 0x52, 0x36, 0xFF, 0xFB, 0x36, 0xC9, 0xAA, 0x78, 0xFC, 0x66, 0x78, 0xAF, 0x98, 0x36,
0x32, 0xED, 0xB9, 0x76, 0xA3, 0xFF, 0x89, 0x2F, 0x11, 0x5B, 0x10, 0xCD, 0xE4, 0x06, 0xBE, 0xCD,
0x6F, 0xE0, 0x9C, 0x55, 0x88, 0x11, 0xF6, 0xBE, 0x47, 0x1D, 0x54, 0x18, 0xD0, 0xF9, 0x03, 0xA3,
0xF1, 0xCB, 0x81, 0xA8, 0x7D, 0xF9, 0x28, 0xAC, 0x4C, 0x58, 0xED, 0xF8, 0xCA, 0x7C, 0x89, 0x2C,
0xAF, 0xF7, 0x99, 0xD1, 0xB8, 0xBB, 0xF3, 0xE4, 0x5F, 0x63, 0xC4, 0x5C, 0x06, 0x80, 0x0A, 0x90,
0x8B, 0x51, 0x2C, 0xFB, 0x9F, 0xAC, 0xE8, 0xDB, 0xF7, 0x38, 0x7E, 0x29, 0xE6, 0x06, 0x72, 0xC2,
0xBB, 0xB8, 0x7B, 0x0D, 0xA6, 0xAF, 0x7E, 0x48, 0xCF, 0x35, 0xD7, 0x61, 0x66, 0x65, 0xF2, 0x1C,
0xEB, 0x1F, 0xA6, 0x3F, 0xCC, 0xC5, 0x97, 0x47, 0x1E, 0xE0, 0x0B, 0x80, 0x30, 0xB7, 0xB0, 0x1C,
0x8D, 0x79, 0xB7, 0x81, 0x40, 0x60, 0x66, 0xFD, 0xE6, 0xDF, 0x88, 0x36, 0xE0, 0x9A, 0xE6, 0xF8,
0x34, 0x82, 0x70, 0xCF, 0x32, 0x5D, 0xD2, 0x0D, 0x0D, 0xB3, 0x6F, 0x2A, 0x07, 0xF9, 0x2A, 0x3B,
0x39, 0x10, 0x75, 0x21, 0x95, 0x8E, 0xF5, 0x3F, 0xAF, 0xFB, 0x4D, 0x2B, 0x7B, 0x86, 0x65, 0x4F,
0x5A, 0x3C, 0x74, 0xC6, 0xB8, 0xBD, 0xE9, 0x48, 0x5A, 0xF1, 0x34, 0xE4, 0x60, 0x0F, 0x72, 0xD8,
0xA6, 0x1C, 0x02, 0xC8, 0x21, 0xB5, 0xD5, 0x90, 0x6F, 0x38, 0x87, 0x3F, 0x9D, 0x64, 0x71, 0x61,
0xF9, 0x27, 0x62, 0x1A, 0xF2, 0x5A, 0x95, 0x74, 0xE8, 0x0D, 0x6E, 0x70, 0xE9, 0x15, 0x16, 0x2F,
0x1A, 0xEF, 0x53, 0xB7, 0x8F, 0xDE, 0xFC, 0xFA, 0xC4, 0x2B, 0x91, 0xEC, 0xF6, 0x3C, 0xE5, 0xA2,
0x57, 0x27, 0x5F, 0x19, 0x00, 0x86, 0x1B, 0xAC, 0x23, 0x22, 0x32, 0xDF, 0xA1, 0x88, 0xA4, 0xD9,
0x2C, 0x32, 0xF1, 0xFF, 0x95, 0xED, 0x78, 0x27, 0x1F, 0x48, 0xF4, 0x88, 0xC5, 0x9D, 0x6E, 0x76,
0xA5, 0x3F, 0x35, 0x39, 0x8D, 0xED, 0x67, 0x78, 0x5D, 0xE3, 0xA4, 0x61, 0xDA, 0xB2, 0xA4, 0x9D,
0x10, 0x55, 0x11, 0x2D, 0xEE, 0x32, 0x58, 0x9F, 0x55, 0xAF, 0x1E, 0x59, 0x52, 0xE6, 0x3B, 0x5E,
0x52, 0xFD, 0xAB, 0x7C, 0x8D, 0x05, 0x1A, 0xB6, 0x30, 0xB8, 0x83, 0xDF, 0xFB, 0x1D, 0xF7, 0x17,
0x5D, 0x01, 0x99, 0xCF, 0xBB, 0x10, 0xD3, 0x38, 0xC9, 0x7B, 0xEA, 0x2B, 0x8C, 0x7D, 0x17, 0x98,
0x44, 0xF9, 0x74, 0x4D, 0xC2, 0xCF, 0xD9, 0x2A, 0xAB, 0xC5, 0x24, 0x62, 0x9A, 0x84, 0xA6, 0x49,
0x34, 0x0C, 0x18, 0xDD, 0x38, 0xEF, 0x62, 0xA6, 0x33, 0x2E, 0x08, 0x4B, 0xDA, 0xE0, 0xB4, 0x72,
0xB6, 0xB7, 0xE9, 0xF4, 0x29, 0xDB, 0x82, 0x84, 0x6E, 0x5A, 0x41, 0x8F, 0x17, 0xC2, 0xC9, 0xAC,
0xD1, 0x7F, 0xA8, 0x61, 0x9B, 0xA3, 0xCB, 0x15, 0x63, 0xA5, 0x33, 0x80, 0x63, 0xB2, 0x17, 0x1E,
0xC6, 0xD2, 0x57, 0xD3, 0x58, 0x1B, 0x14, 0x35, 0x94, 0x4E, 0x7A, 0xD4, 0x05, 0x45, 0x90, 0x63,
0x0C, 0x97, 0x1C, 0x99, 0x14, 0x70, 0x24, 0x6B, 0x9C, 0xA1, 0x12, 0x6E, 0x35, 0x1C, 0x5C, 0x6A,
0x64, 0x5E, 0x4D, 0xBE, 0x5B, 0xE2, 0x34, 0xA0, 0x8A, 0xFD, 0xA1, 0x90, 0x18, 0xA9, 0x70, 0x87,
0xC0, 0x22, 0x52, 0xEB, 0x91, 0xA4, 0x3D, 0xF1, 0x6A, 0xC4, 0x78, 0x1A, 0xA4, 0x97, 0x83, 0x58,
0x36, 0xD1, 0x7F, 0xE0, 0xA7, 0xA0, 0xC8, 0xCB, 0x2B, 0xFF, 0x43, 0x22, 0x84, 0xDF, 0x6A, 0xEF,
0x23, 0x86, 0xCB, 0xCF, 0x4B, 0xE7, 0x0B, 0x36, 0xFD, 0xEE, 0x15, 0xCE, 0x3D, 0xFE, 0xF3, 0xC7,
0xFD, 0xDC, 0xBE, 0x4F, 0x02, 0xE1, 0x25, 0xB9, 0xBA, 0xF8, 0x5F, 0x05, 0xE2, 0x8D, 0xB2, 0x69,
0x7E, 0xB6, 0x3B, 0x4B, 0x70, 0xCF, 0xAB, 0x04, 0x18, 0xEB, 0x81, 0x38, 0xD5, 0x75, 0xA9, 0xAF,
0x7A, 0x79, 0x9F, 0xBF, 0x1D, 0xC7, 0x25, 0x87, 0x6B, 0x71, 0xC9, 0x7C, 0x6C, 0xD2, 0x20, 0x86,
0x68, 0x73, 0x68, 0x7A, 0x4D, 0x5D, 0x47, 0xD6, 0xE3, 0xC2, 0x04, 0xDC, 0x56, 0xF1, 0x3F, 0x2A,
0xB2, 0xD2, 0x8F, 0xED, 0xCA, 0x4F, 0x80, 0x5C, 0xFC, 0x7F, 0xBE, 0x5B, 0xBD, 0x02, 0xCB, 0x78,
0xC5, 0xBF, 0x52, 0x28, 0xF7, 0x93, 0xBC, 0x41, 0x2E, 0xB7, 0x7E, 0xD9, 0xFD, 0xAF, 0x54, 0xD9,
0x0F, 0xE2, 0x75, 0xD9, 0x17, 0xC8, 0x4D, 0xF4, 0x58, 0x1D, 0x8C, 0xFB, 0x5E, 0xD1, 0xEF, 0x2E,
0xF9, 0x4B, 0x11, 0x3F, 0x43, 0xAD, 0x2F, 0xCD, 0xCD, 0x5F, 0xB2, 0xDC, 0x94, 0x63, 0x7D, 0xB8,
0xA9, 0x37, 0xEF, 0xF7, 0x8B, 0x04, 0x50, 0xB5, 0xF4, 0xA4, 0x82, 0x19, 0x31, 0x47, 0x08, 0x89,
0x0C, 0x91, 0x45, 0xFB, 0xB9, 0xC7, 0xED, 0x8A, 0x8E, 0xF4, 0x42, 0x29, 0xB6, 0x92, 0x5A, 0xE5,
0x16, 0x1E, 0x69, 0x83, 0x0C, 0xEE, 0x31, 0x9A, 0x76, 0x3D, 0xF5, 0x64, 0x6F, 0xCB, 0xC2, 0xC9,
0x90, 0xFE, 0x2C, 0xE8, 0x0B, 0xD6, 0xF1, 0xB8, 0xF3, 0xD3, 0x0C, 0x42, 0xA3, 0xC8, 0x7C, 0x0A,
0xEC, 0x88, 0xB8, 0xB2, 0xCE, 0x31, 0x9F, 0x41, 0x4A, 0x35, 0x20, 0xF4, 0x3A, 0x24, 0xEF, 0x71,
0x89, 0xC0, 0x19, 0xC4, 0x01, 0xA6, 0x91, 0x4D, 0xD2, 0x6B, 0x50, 0x08, 0x6B, 0xC5, 0x9A, 0xE3,
0xB3, 0x26, 0xC1, 0x01, 0x45, 0x21, 0x2C, 0xC7, 0xCA, 0xDC, 0x04, 0x9C, 0xDC, 0x17, 0x6E, 0x35,
0xBD, 0x22, 0x9F, 0x65, 0x90, 0x21, 0xF0, 0x72, 0xC5, 0xBF, 0x05, 0xAF, 0xB3, 0xF5, 0x79, 0xA3,
0x19, 0x0E, 0xF2, 0x73, 0x31, 0x32, 0x16, 0x09, 0x6D, 0x32, 0x6A, 0xB0, 0x2E, 0x5C, 0x56, 0x98,
0xC1, 0xD8, 0x3E, 0x3B, 0x7C, 0x51, 0x5F, 0x74, 0xD8, 0x51, 0x52, 0x7B, 0xA5, 0x59, 0xD1, 0x96,
0xCA, 0xF1, 0x3F, 0xE1, 0xC8, 0x7E, 0xBE, 0x48, 0x3D, 0xEA, 0xE0, 0x71, 0x65, 0x07, 0x02, 0x53,
0xCE, 0xF4, 0x6B, 0xCB, 0x1A, 0xB6, 0xE1, 0x07, 0xF3, 0xFF, 0x31, 0x03, 0x9F, 0xD7, 0x70, 0xE3,
0x76, 0x34, 0xDA, 0x6C, 0xD6, 0xA0, 0xA8, 0x55, 0x38, 0x88, 0x1F, 0x4A, 0xAF, 0x21, 0xE9, 0xFF,
0x43, 0x84, 0x3B, 0xE9, 0xA4, 0x00, 0x5D, 0xF6, 0x7B, 0xB7, 0x92, 0xBE, 0x03, 0x83, 0xD3, 0x4B,
0x70, 0x9C, 0x2F, 0x42, 0x8A, 0x3F, 0xC2, 0xE9, 0xB5, 0x6C, 0x34, 0xDA, 0x1B, 0x9A, 0x68, 0xF5,
0xDC, 0x3F, 0x08, 0x35, 0x02, 0xE5, 0xDD, 0x3E, 0x9B, 0x7E, 0x7E, 0xB6, 0xAD, 0x81, 0xA9, 0x91,
0x8F, 0x35, 0xEB, 0xA3, 0xC4, 0xC9, 0xBD, 0xE2, 0x35, 0x36, 0xF0, 0xA7, 0xA9, 0xF7, 0x75, 0xAE,
0xB4, 0x25, 0xC0, 0xE0, 0xA2, 0x51, 0x6B, 0x51, 0xEC, 0x7D, 0xD6, 0xD3, 0x99, 0x4A, 0x33, 0x84,
0x75, 0x7B, 0x7E, 0xDC, 0x62, 0x4E, 0xA8, 0xC7, 0xF0, 0x52, 0x4C, 0x79, 0x69, 0xFB, 0x2A, 0xBC,
0xF0, 0x52, 0xA8, 0x85, 0xD3, 0x4B, 0xEE, 0x0C, 0x2F, 0xC9, 0x22, 0x2F, 0x50, 0x0B, 0xC5, 0x80,
0x6B, 0x47, 0xFE, 0x17, 0x03, 0x73, 0xDE, 0xE8, 0x99, 0x78, 0xF3, 0x44, 0x26, 0xCA, 0x45, 0x26,
0xEC, 0xD4, 0x4D, 0x9D, 0x32, 0x88, 0xED, 0x7A, 0xB7, 0xEF, 0x9B, 0xB0, 0x3A, 0xE6, 0xE5, 0x47,
0x18, 0x59, 0x1F, 0x6D, 0xD6, 0x33, 0x8C, 0xA4, 0x53, 0x8A, 0xEB, 0x29, 0x23, 0xD1, 0xF4, 0x34,
0x6C, 0x69, 0xCA, 0x48, 0x7A, 0x54, 0x29, 0x2C, 0x01, 0x54, 0x4E, 0xE9, 0x15, 0xAC, 0xF4, 0xC3,
0x60, 0x0B, 0x3E, 0xA1, 0xBE, 0x37, 0xEF, 0x2F, 0x45, 0x29, 0x6B, 0x3D, 0x3F, 0xAF, 0x1E, 0xE5,
0x27, 0x9E, 0xF2, 0xB3, 0x32, 0x51, 0x0A, 0x56, 0xAD, 0x0D, 0x63, 0xCB, 0xB6, 0x0A, 0x3F, 0x7F,
0x99, 0x69, 0x60, 0xBF, 0xCF, 0xEB, 0xB1, 0xFF, 0xD8, 0x58, 0xCE, 0xAC, 0xB5, 0xFC, 0x1F, 0x6D,
0x90, 0x31, 0x4E, 0xC3, 0x40, 0x10, 0x45, 0xC7, 0x76, 0x90, 0x0B, 0x4B, 0x6C, 0x0A, 0xA8, 0x40,
0x2C, 0x17, 0x20, 0xA6, 0xA0, 0x4C, 0xBC, 0x2B, 0x53, 0xA4, 0x48, 0x4D, 0x9F, 0x23, 0x50, 0xD2,
0x38, 0x31, 0x15, 0xD7, 0xE0, 0x08, 0x94, 0x41, 0x72, 0x64, 0xA3, 0x14, 0xE9, 0x60, 0x09, 0x07,
0x48, 0x1A, 0x2A, 0x8A, 0x4C, 0x84, 0x51, 0x56, 0xCA, 0xDA, 0xC3, 0x86, 0x06, 0x22, 0xF1, 0xEB,
0x3F, 0xFF, 0xBF, 0xF9, 0xA7, 0x41, 0x51, 0xFB, 0x25, 0x2F, 0x04, 0xDC, 0x03, 0xC8, 0x96, 0x8F,
0x55, 0x78, 0xA9, 0x2E, 0x60, 0x2B, 0x56, 0xB8, 0x04, 0x03, 0xCD, 0xEE, 0x66, 0x18, 0xB6, 0x61,
0xD1, 0x00, 0xAE, 0x96, 0x75, 0x3E, 0xAD, 0xFB, 0x11, 0x1C, 0x5E, 0x75, 0xA9, 0xCE, 0x49, 0xF5,
0x61, 0x0C, 0xF9, 0xFB, 0x88, 0x4C, 0xA0, 0x21, 0x21, 0x4A, 0x12, 0x7F, 0x8E, 0x44, 0x6C, 0xAD,
0x12, 0x80, 0x50, 0xE7, 0xB5, 0x1E, 0xA2, 0x68, 0x0E, 0x1C, 0xCD, 0xD2, 0x00, 0x1C, 0x7B, 0x2F,
0xCA, 0x47, 0x83, 0x6D, 0x6C, 0x57, 0xD9, 0xB0, 0xE4, 0xCA, 0x01, 0x79, 0x73, 0xC2, 0x26, 0xAB,
0x32, 0x11, 0x6C, 0xFA, 0x84, 0xD7, 0xC7, 0xB6, 0xF4, 0xC1, 0x9D, 0xA7, 0x59, 0xC4, 0x9D, 0x8D,
0xB2, 0x91, 0x21, 0x34, 0x1B, 0x41, 0xAC, 0x8C, 0xF0, 0x5F, 0x4B, 0xC1, 0x8A, 0xB2, 0xE3, 0x49,
0x65, 0x3D, 0xD2, 0xA7, 0x2E, 0xAD, 0xD5, 0x50, 0x79, 0x0A, 0x64, 0xD0, 0x9B, 0xCC, 0xD0, 0x88,
0x1E, 0x66, 0x2D, 0x4F, 0xF3, 0xC2, 0xB0, 0x5B, 0x8C, 0xFC, 0x34, 0x0A, 0x5F, 0xDE, 0x30, 0x63,
0x31, 0x9E, 0xB9, 0x1F, 0xB4, 0x79, 0x3E, 0x87, 0x68, 0xDB, 0xA3, 0xED, 0x63, 0xBB, 0x98, 0x47,
0xDD, 0x6A, 0x45, 0x0C, 0x37, 0x55, 0x28, 0x79, 0x6C, 0x58, 0xA1, 0x43, 0x2F, 0x6D, 0x38, 0xE4,
0x93, 0x63, 0xBC, 0x85, 0xF0, 0x70, 0xCF, 0xD6, 0x8D, 0xA2, 0xC0, 0xC6, 0x7E, 0xE5, 0xAB, 0xCA,
0xFC, 0x08, 0x0E, 0x80, 0x2D, 0x3C, 0x92, 0xD9, 0x98, 0xC7, 0x9F, 0x6A, 0xFF, 0xEF, 0x06, 0xFF,
0x6D, 0xB4, 0x8B, 0x6B, 0x2D, 0x50, 0x02, 0x97, 0x2E, 0x42, 0x07, 0x82, 0x14, 0xFA, 0xB6, 0xE0,
0x17, 0xC7, 0x12, 0x18, 0x56, 0x09, 0xF9, 0x0D, 0xD5, 0x7C, 0x4D, 0x8C, 0xDD, 0x56, 0x76, 0xE6,
0x25, 0x29, 0x89, 0xE8, 0x66, 0x3C, 0x54, 0x80, 0x56, 0x3A, 0x48, 0xB5, 0xCD, 0x9E, 0x5D, 0x63,
0x92, 0x16, 0x7B, 0xA1, 0x00, 0x5E, 0x54, 0x15, 0x29, 0x0B, 0x48, 0x16, 0x5E, 0x58, 0xC0, 0xF8,
0x49, 0x0B, 0x2D, 0x94, 0xE5, 0x00, 0x59, 0x54, 0x2F, 0x1C, 0x40, 0x01, 0xAA, 0x8A, 0x1C, 0x0B,
0x33, 0x59, 0x64, 0xD1, 0xDA, 0xA8, 0x7B, 0x91, 0x45, 0x3B, 0x9B, 0xD9, 0x4D, 0xDC, 0x0B, 0x03,
0xAD, 0x00, 0x25, 0x91, 0x96, 0x90, 0xD1, 0xC2, 0x0B, 0x71, 0xC6, 0x10, 0x7A, 0x29, 0x0E, 0x22,
0xA1, 0x83, 0x36, 0x26, 0xA2, 0x6C, 0x56, 0xCC, 0xB2, 0x48, 0xDE, 0xF9, 0xBE, 0x73, 0x2F, 0x5F,
0xBD, 0xFA, 0x93, 0x2D, 0xCB, 0x76, 0x77, 0xCA, 0x7E, 0xD4, 0x7B, 0x7C, 0x8F, 0x97, 0xF7, 0xE7,
0x9C, 0xEF, 0x7C, 0xE7, 0xE7, 0x52, 0xFD, 0x85, 0x52, 0x2A, 0xC1, 0x2B, 0xEC, 0x70, 0xD0, 0xA5,
0x52, 0x27, 0x7A, 0xBC, 0x39, 0xAE, 0xE6, 0x7F, 0x99, 0xD6, 0x43, 0xA4, 0xB5, 0x4E, 0x93, 0xD9,
0x85, 0x2A, 0x2C, 0xD5, 0x5B, 0x5E, 0xA3, 0x5E, 0x56, 0xBD, 0x72, 0xCC, 0x65, 0xB8, 0x02, 0x27,
0x70, 0xA9, 0xEE, 0x55, 0xA2, 0xB5, 0x0A, 0xEF, 0xCF, 0xCC, 0x89, 0x7E, 0x6A, 0xB8, 0x54, 0x2F,
0xE3, 0x44, 0x98, 0xF6, 0xCA, 0xAB, 0xD0, 0x46, 0x53, 0xE0, 0xA7, 0x68, 0x74, 0x54, 0x4E, 0x1B,
0xA5, 0x4A, 0x87, 0x8D, 0x4A, 0xEE, 0xF4, 0xCA, 0xAF, 0x36, 0xD4, 0xE2, 0x9F, 0x83, 0x5B, 0xB6,
0xBC, 0xB7, 0x1A, 0x66, 0x97, 0xD3, 0x04, 0xD7, 0xA2, 0xA1, 0xF7, 0xD0, 0xD0, 0xB1, 0xC5, 0x96,
0x95, 0xA7, 0x75, 0x8D, 0x7B, 0xB7, 0x2A, 0x99, 0xBD, 0xB9, 0xDB, 0x19, 0xFB, 0x8B, 0xF7, 0x70,
0x62, 0x05, 0x27, 0xA2, 0x74, 0x98, 0x5D, 0xBA, 0x8D, 0x06, 0x9F, 0xE0, 0xD5, 0xE1, 0xA5, 0xCB,
0x50, 0xB3, 0xC3, 0x3B, 0x17, 0xB7, 0x2F, 0x95, 0x21, 0x5A, 0x5F, 0x56, 0x8D, 0xD7, 0x78, 0x65,
0x88, 0xAB, 0xCE, 0xD8, 0x36, 0xE4, 0x16, 0x78, 0x7B, 0x92, 0x6F, 0xD1, 0x0D, 0xDE, 0xAA, 0xE3,
0xD9, 0xAC, 0xE6, 0x0F, 0x0A, 0xBE, 0xF5, 0x3A, 0xBE, 0x8D, 0x4A, 0xFE, 0xB6, 0xE7, 0xDB, 0x70,
0xF1, 0xAD, 0x8F, 0x6E, 0x75, 0xE8, 0x5C, 0x1A, 0xE5, 0x6A, 0x6A, 0x34, 0xE3, 0x21, 0xAA, 0x70,
0x58, 0xE2, 0x84, 0x67, 0x23, 0xBF, 0xD1, 0x29, 0x07, 0xCC, 0x6F, 0xBE, 0x65, 0xEE, 0xEB, 0x68,
0xA5, 0x02, 0xDC, 0x32, 0xC6, 0x0F, 0xBF, 0xB3, 0x67, 0x29, 0x38, 0x73, 0xBD, 0xB7, 0x3D, 0xEB,
0xD1, 0x5C, 0x87, 0xD7, 0x0D, 0xBC, 0xB8, 0x22, 0x3F, 0x66, 0xF3, 0xCF, 0xF3, 0x8A, 0x75, 0x85,
0xF6, 0xD0, 0xFE, 0x09, 0xFD, 0x8E, 0xC2, 0xFA, 0x96, 0xF1, 0xA3, 0xB5, 0x26, 0xCE, 0xD5, 0x16,
0x3A, 0x1B, 0x63, 0x18, 0xFE, 0xDD, 0x5A, 0xA9, 0xB7, 0xE7, 0x93, 0x89, 0x51, 0x60, 0xCA, 0x4A,
0xDC, 0xF9, 0xFC, 0x7C, 0xFE, 0x03, 0x5C, 0xED, 0xE0, 0xC3, 0xEF, 0x25, 0xB9, 0x0A, 0xEE, 0x76,
0x2A, 0x68, 0x8A, 0x47, 0x6B, 0xAD, 0xCF, 0xD5, 0x58, 0xD2, 0xD7, 0xD0, 0xDD, 0x0E, 0xD7, 0xB5,
0xE1, 0xF6, 0xDA, 0xDB, 0x9D, 0xEA, 0x12, 0x15, 0x9E, 0x6B, 0xD4, 0x7B, 0x49, 0x7A, 0xCC, 0xC5,
0xC0, 0x42, 0x5C, 0x96, 0x60, 0x02, 0x8A, 0x16, 0xAF, 0x1A, 0xE3, 0x4D, 0x95, 0xDB, 0xBF, 0xAA,
0xC2, 0xBB, 0xB9, 0xEA, 0xB7, 0x54, 0xF8, 0x41, 0xED, 0xB5, 0xD9, 0x75, 0x8D, 0xA6, 0xF2, 0x13,
0x68, 0x89, 0x2B, 0x56, 0xA1, 0x81, 0x12, 0x1D, 0x87, 0x94, 0x3D, 0xE3, 0x8D, 0x23, 0x8B, 0xBB,
0xE1, 0x3F, 0x68, 0xB4, 0x0E, 0x3F, 0x9D, 0x8B, 0x94, 0xA7, 0x87, 0x44, 0xE7, 0x18, 0x55, 0xAF,
0xBE, 0xD0, 0x21, 0xD2, 0x77, 0x30, 0xCB, 0x5A, 0xBB, 0x58, 0x77, 0x9C, 0xFA, 0x72, 0xFF, 0x63,
0x22, 0x31, 0x4B, 0x05, 0x06, 0xA6, 0xE2, 0x96, 0x9F, 0x38, 0x8E, 0x51, 0xE4, 0x08, 0x33, 0xA4,
0xD4, 0xE6, 0x8C, 0x13, 0x49, 0xC1, 0x63, 0x0F, 0x4B, 0x0A, 0xAF, 0x0A, 0x8D, 0xD4, 0x2D, 0xCB,
0x1C, 0x3B, 0xE6, 0x2B, 0x1F, 0xC2, 0xBA, 0xA3, 0xD4, 0x69, 0x4C, 0x26, 0xAE, 0xBE, 0xA1, 0x86,
0x0B, 0x1A, 0xDA, 0x80, 0xAF, 0xD0, 0x37, 0xDC, 0x07, 0x2B, 0xB0, 0x4E, 0x51, 0x6C, 0xDC, 0x5A,
0xFA, 0x1E, 0xA6, 0xF8, 0x2A, 0x51, 0x98, 0xC5, 0xD2, 0xFD, 0xEC, 0x6F, 0x2A, 0xBC, 0x8D, 0x1E,
0x40, 0xD7, 0x86, 0x0B, 0x63, 0x02, 0xA9, 0x85, 0xBA, 0x6C, 0xB2, 0x07, 0x0F, 0xB1, 0xF8, 0x79,
0x01, 0x7D, 0x87, 0x04, 0x66, 0x63, 0x4A, 0x91, 0xB0, 0x92, 0xF1, 0x45, 0xFF, 0xE1, 0x4C, 0x8F,
0xA9, 0xFC, 0xA3, 0x5B, 0xAF, 0x55, 0x5E, 0x7B, 0xA9, 0x37, 0xDF, 0xDD, 0x32, 0xFF, 0x24, 0x87,
0xFD, 0xB3, 0x29, 0xFF, 0x38, 0x03, 0x2F, 0xD8, 0xBE, 0xD4, 0x61, 0x55, 0x20, 0x5A, 0xB5, 0xF4,
0xE5, 0x33, 0x59, 0xE7, 0xDA, 0x1E, 0xA1, 0x9A, 0x17, 0x6B, 0xD5, 0x42, 0x2B, 0x2B, 0xD1, 0x4D,
0x39, 0xBA, 0xF9, 0xA4, 0x47, 0xD3, 0xF1, 0x18, 0x8F, 0x4F, 0x39, 0x9F, 0x9E, 0x99, 0xDC, 0x1D,
0x55, 0xC8, 0x68, 0xE2, 0xD2, 0xEA, 0xE3, 0xB3, 0x8F, 0x99, 0x4E, 0x8B, 0x01, 0xB7, 0x3C, 0x4B,
0x0D, 0x57, 0x27, 0x65, 0x41, 0x38, 0xE7, 0x5C, 0xA0, 0x44, 0x70, 0x0D, 0xB7, 0x74, 0x1E, 0x2E,
0x22, 0x53, 0xA6, 0xCB, 0xA0, 0xC4, 0x75, 0x31, 0xD7, 0x20, 0xE3, 0x81, 0x28, 0xE0, 0x70, 0x5C,
0xE8, 0xA5, 0xD7, 0xF8, 0x39, 0x0E, 0x21, 0x3B, 0x77, 0x9A, 0xBD, 0xEA, 0x79, 0x60, 0xCF, 0x9A,
0x98, 0x1D, 0x93, 0x3B, 0x07, 0x84, 0x10, 0x4E, 0x41, 0xE3, 0x0A, 0x56, 0x8C, 0x3C, 0x64, 0x39,
0xBB, 0x5D, 0xC5, 0x68, 0xBE, 0xC3, 0x3D, 0xB0, 0xAE, 0x0E, 0x71, 0x41, 0x85, 0xB9, 0xA0, 0x51,
0x29, 0xF7, 0xAE, 0xE6, 0xF8, 0x61, 0x00, 0x63, 0xB1, 0x5B, 0x79, 0x04, 0x80, 0xEB, 0x38, 0xA4,
0x44, 0x19, 0x49, 0x16, 0xB9, 0x50, 0x9E, 0xC8, 0x75, 0x42, 0xA9, 0x70, 0x35, 0x4F, 0xC7, 0x22,
0x2E, 0xAD, 0x48, 0x3A, 0x94, 0x32, 0x71, 0x5A, 0xFE, 0x3A, 0xCA, 0x79, 0xBA, 0xA3, 0x10, 0xDD,
0x63, 0x57, 0x12, 0xB9, 0x4C, 0x13, 0xD1, 0xD0, 0x82, 0x51, 0x0E, 0x11, 0x2D, 0xBC, 0x09, 0x74,
0xE5, 0x12, 0x8B, 0xD2, 0x48, 0x03, 0xFF, 0xD4, 0x0A, 0xCE, 0x55, 0x80, 0x41, 0x6F, 0xB8, 0xDC,
0x10, 0x2C, 0x1A, 0x42, 0x58, 0xA5, 0xF6, 0xFF, 0x41, 0x35, 0x33, 0xFD, 0xAE, 0xCE, 0x03, 0x2C,
0xB7, 0x12, 0xAD, 0x85, 0x5A, 0x38, 0x00, 0x0E, 0xB9, 0x47, 0xAD, 0xFC, 0xDA, 0x6D, 0x78, 0x23,
0x00, 0x43, 0x94, 0x6F, 0x71, 0xCA, 0x56, 0xA9, 0x27, 0x11, 0x27, 0xE1, 0x1E, 0xD7, 0x81, 0xF6,
0x49, 0x25, 0xF5, 0x7C, 0xFD, 0x09, 0xA1, 0x90, 0x7E, 0xA5, 0xCE, 0xAC, 0x70, 0x5A, 0x08, 0xA6,
0xBE, 0xE6, 0xB9, 0x5B, 0x76, 0x46, 0x32, 0x7D, 0x57, 0xD7, 0xC0, 0x61, 0x2B, 0x83, 0xD3, 0x84,
0x7C, 0x75, 0x6F, 0xB7, 0x67, 0x17, 0x1B, 0x97, 0x12, 0x8B, 0x25, 0x23, 0xF4, 0xEC, 0xB1, 0x1D,
0xEC, 0x28, 0xF4, 0x16, 0x7F, 0xAE, 0x4C, 0xC6, 0xCB, 0x32, 0x0B, 0xB2, 0x90, 0x27, 0xE4, 0x48,
0x99, 0x53, 0xB1, 0x8C, 0x47, 0xBA, 0xFD, 0xD7, 0x14, 0xBB, 0xF0, 0x8D, 0x92, 0xBA, 0x4F, 0x04,
0x38, 0xED, 0xD7, 0x84, 0x06, 0xB6, 0xB6, 0xC5, 0x86, 0x43, 0x9A, 0x12, 0x87, 0x48, 0x07, 0xFC,
0xC6, 0x04, 0x1B, 0x99, 0xDF, 0x12, 0x59, 0x06, 0xDA, 0xA4, 0xF8, 0xCA, 0xE9, 0xCD, 0x0A, 0xF1,
0xE6, 0xA3, 0xAB, 0x6B, 0xA7, 0x18, 0x0B, 0x8D, 0x5F, 0x37, 0x0B, 0x76, 0xFC, 0x12, 0xC1, 0x86,
0xE0, 0x42, 0x9C, 0x39, 0xBE, 0x6B, 0x4B, 0xB7, 0xCF, 0x73, 0x8D, 0x88, 0xDA, 0x1A, 0xD6, 0xD6,
0xA7, 0x3A, 0x27, 0x39, 0x05, 0x94, 0x36, 0x8D, 0x22, 0x44, 0x63, 0x87, 0x13, 0x11, 0xEC, 0x78,
0x51, 0x6B, 0x51, 0x5C, 0x60, 0xC7, 0x1F, 0xA1, 0x13, 0x68, 0xB9, 0x75, 0x8A, 0x0B, 0xB0, 0x12,
0x65, 0x88, 0x96, 0xD1, 0x0B, 0xF6, 0x83, 0x4B, 0x8C, 0x86, 0xA0, 0x23, 0x1E, 0xF5, 0xBA, 0x31,
0x76, 0xE4, 0xFE, 0x5A, 0x23, 0x32, 0x4F, 0x89, 0x4A, 0x8C, 0x4A, 0xF0, 0x56, 0x19, 0x2F, 0x41,
0xEF, 0x8A, 0x52, 0x8B, 0xA0, 0xA0, 0xE5, 0x7D, 0x06, 0xAF, 0xB7, 0x06, 0xEF, 0x0A, 0x5E, 0x3F,
0xFA, 0xD2, 0x06, 0x4F, 0x50, 0x58, 0xCC, 0xBF, 0xFF, 0xE8, 0x72, 0x69, 0x90, 0x57, 0x0E, 0xFE,
0xFC, 0x10, 0xD0, 0x56, 0x04, 0x29, 0x71, 0x5C, 0x0E, 0x22, 0xA9, 0x3C, 0x9C, 0xE6, 0x61, 0x85,
0x87, 0x65, 0x1E, 0x08, 0xB2, 0xAA, 0x25, 0xD2, 0x12, 0x4C, 0x82, 0x47, 0xB3, 0xCB, 0xA5, 0x9E,
0xFF, 0x89, 0x99, 0x94, 0x03, 0x44, 0x59, 0xAD, 0x5E, 0xC1, 0xE1, 0x87, 0x72, 0xF8, 0x11, 0x0E,
0xBF, 0xB7, 0xB0, 0x1C, 0x17, 0x27, 0x6A, 0x73, 0x24, 0xAD, 0x1A, 0x9F, 0x87, 0x56, 0x05, 0x55,
0x80, 0xB5, 0xE8, 0xBC, 0xC1, 0xD1, 0x1D, 0x88, 0x84, 0xA6, 0x69, 0x84, 0x60, 0x52, 0xB1, 0xD1,
0x91, 0x08, 0x57, 0x43, 0x63, 0xDC, 0x3A, 0x2C, 0xA9, 0x5C, 0xCB, 0x5E, 0x13, 0x89, 0x8D, 0xE9,
0x43, 0x82, 0x4D, 0x9B, 0x04, 0x44, 0x9B, 0x48, 0x8B, 0xF6, 0x86, 0x66, 0x10, 0x41, 0xD5, 0x03,
0xBA, 0x28, 0x06, 0x32, 0x97, 0x00, 0x8B, 0x4D, 0x34, 0x80, 0xC5, 0x08, 0x2B, 0x8A, 0x5B, 0x4F,
0x0E, 0x30, 0x72, 0xB5, 0x81, 0x16, 0x94, 0xBC, 0x0E, 0x10, 0x4C, 0x86, 0x94, 0x13, 0x1E, 0x2A,
0x80, 0x59, 0x8A, 0x0E, 0xA9, 0x2C, 0x55, 0xC5, 0x0E, 0xC7, 0xE2, 0x8C, 0x17, 0x46, 0x1F, 0xF0,
0x16, 0xA1, 0xC5, 0x2B, 0x32, 0xD2, 0x4D, 0x19, 0xEC, 0xA9, 0x35, 0xB0, 0xC1, 0x41, 0xD1, 0xE6,
0x2A, 0x1F, 0x2F, 0xB7, 0x33, 0x73, 0x10, 0xDE, 0xC5, 0x88, 0x57, 0x94, 0xB3, 0x03, 0x7B, 0x77,
0x67, 0xBC, 0x30, 0x80, 0x15, 0x54, 0x4E, 0xF1, 0xF0, 0xB7, 0x08, 0x78, 0x4E, 0x7A, 0x5C, 0x56,
0x81, 0xEB, 0x20, 0xA3, 0xF7, 0xFA, 0xB0, 0x16, 0x0B, 0x44, 0x55, 0xD7, 0xA2, 0xF6, 0x27, 0x17,
0xCC, 0x45, 0x88, 0x6E, 0x0E, 0x18, 0xFA, 0x37, 0xD1, 0xCD, 0xDA, 0x61, 0x37, 0x71, 0xCB, 0xE6,
0x9B, 0xB2, 0x53, 0x83, 0x58, 0x6C, 0xAA, 0x36, 0x58, 0x9C, 0x90, 0x1A, 0x61, 0x31, 0x86, 0xD1,
0x08, 0x85, 0x11, 0x3A, 0x43, 0xC1, 0x33, 0xDA, 0xE5, 0xD6, 0x3C, 0x79, 0x83, 0x27, 0x57, 0xA4,
0xDB, 0x4A, 0xF4, 0x0E, 0x27, 0x85, 0xC2, 0x40, 0xA1, 0x12, 0x25, 0xAA, 0xF5, 0x83, 0x0D, 0x76,
0x04, 0x7D, 0x1A, 0x00, 0x8F, 0xBE, 0xEE, 0x85, 0xB9, 0x40, 0x2A, 0x73, 0x08, 0xA8, 0x2A, 0x7A,
0xCC, 0x5A, 0xA5, 0x8A, 0x92, 0x06, 0x01, 0x64, 0xD9, 0xC7, 0xEF, 0x7E, 0xD9, 0xA8, 0x5F, 0xD6,
0x2A, 0x5C, 0x53, 0x21, 0x5A, 0x78, 0xD2, 0x3A, 0x1F, 0x43, 0x41, 0xC2, 0xFC, 0x87, 0x31, 0xFA,
0xD1, 0x7B, 0xB7, 0xF1, 0xC1, 0x2F, 0xD7, 0x23, 0x00, 0xE8, 0x6A, 0x70, 0x16, 0x8C, 0xCC, 0x6B,
0x9A, 0x28, 0x75, 0x9B, 0x28, 0x84, 0x09, 0x3A, 0xAD, 0xFE, 0xAD, 0x0A, 0x73, 0x68, 0x05, 0xAD,
0xCF, 0xAA, 0xCA, 0xD0, 0x4F, 0x70, 0xAC, 0x16, 0xDD, 0x59, 0x51, 0x31, 0x85, 0xBA, 0xC2, 0xC4,
0x0D, 0x2E, 0x2D, 0x9B, 0x00, 0x2A, 0x7A, 0x20, 0x13, 0xAC, 0xB7, 0xC1, 0xCD, 0x62, 0xB0, 0x18,
0x91, 0xD5, 0x5E, 0x19, 0x26, 0x6A, 0x6C, 0x9B, 0x40, 0xE0, 0xFE, 0xD3, 0xDA, 0x3A, 0x4A, 0x68,
0x69, 0x98, 0x01, 0x2F, 0x9E, 0xFD, 0xEB, 0xDD, 0xD3, 0xB2, 0xB2, 0x03, 0x64, 0x3E, 0x84, 0x2E,
0x9D, 0xA0, 0x8C, 0x41, 0xD9, 0x31, 0x03, 0x33, 0x68, 0x18, 0x06, 0xD6, 0xD0, 0xFA, 0x76, 0x49,
0x0A, 0x85, 0xA4, 0x8B, 0x31, 0xDE, 0xA4, 0xE4, 0xED, 0x22, 0xD0, 0xBE, 0x03, 0xED, 0xCE, 0x66,
0x41, 0x03, 0x24, 0x57, 0x90, 0x2B, 0xB5, 0xF0, 0xC3, 0x42, 0x98, 0xCA, 0x19, 0x66, 0x97, 0x5E,
0x97, 0x50, 0x78, 0xB1, 0x69, 0xBF, 0x12, 0xF3, 0x06, 0x08, 0x9E, 0x4D, 0xA6, 0xA5, 0xB1, 0xBD,
0xFA, 0xCA, 0xDE, 0xBA, 0xD0, 0xE2, 0x82, 0x83, 0x03, 0x48, 0xFF, 0x31, 0x80, 0x1F, 0xF7, 0x6D,
0x97, 0xB6, 0x85, 0x4F, 0x8E, 0x94, 0x38, 0xCB, 0x1F, 0xA7, 0xD7, 0x2D, 0x1A, 0x18, 0x6F, 0x7B,
0xAD, 0xF5, 0xE8, 0x92, 0x60, 0x01, 0x8E, 0xC6, 0xFC, 0x72, 0x72, 0x72, 0x88, 0x17, 0xBD, 0x3B,
0x5E, 0xE8, 0x21, 0xD3, 0x5B, 0x98, 0xD7, 0x75, 0xDC, 0x7D, 0x19, 0x08, 0xF8, 0x7D, 0xFA, 0x08,
0x5B, 0x16, 0x58, 0x17, 0x5F, 0x83, 0xA5, 0x11, 0x9C, 0x4E, 0x38, 0x38, 0x2A, 0xC2, 0x94, 0xFB,
0xE3, 0x6C, 0xCD, 0xE1, 0xEC, 0x2C, 0xE9, 0x77, 0x38, 0x2B, 0x8F, 0x69, 0x4B, 0xC8, 0x54, 0x1F,
0x40, 0xB5, 0x57, 0x48, 0x53, 0x1F, 0x28, 0x3A, 0x93, 0x82, 0xD4, 0xC9, 0x44, 0x53, 0x9E, 0xE7,
0x8D, 0x8F, 0xC6, 0x1D, 0x6D, 0x4C, 0x55, 0xA4, 0x3F, 0xE4, 0xBC, 0x74, 0x00, 0x54, 0x08, 0x25,
0x16, 0x38, 0x66, 0xAF, 0xC8, 0x93, 0x1A, 0x42, 0x78, 0x92, 0xC2, 0xE6, 0x3B, 0xBD, 0x43, 0x88,
0xAC, 0x88, 0xE5, 0x99, 0x47, 0xAB, 0xD1, 0xDE, 0x10, 0xBA, 0x44, 0xE8, 0x29, 0x84, 0x59, 0x88,
0x97, 0x11, 0xE7, 0xE2, 0x50, 0xF0, 0x2D, 0x7F, 0xEA, 0x07, 0xE4, 0x1F, 0xE2, 0x86, 0x84, 0x42,
0x42, 0x32, 0xA1, 0x9A, 0x01, 0x51, 0xC0, 0xA1, 0xB7, 0x61, 0x79, 0x0C, 0xAF, 0x8D, 0x69, 0x89,
0x0B, 0x8E, 0x7A, 0x3C, 0xD7, 0xAC, 0x55, 0x03, 0x21, 0x6F, 0x13, 0x1D, 0x8E, 0x0B, 0x2E, 0x9F,
0x31, 0x2F, 0xE2, 0x7C, 0x0D, 0xF4, 0x35, 0x1E, 0x43, 0x73, 0xC2, 0x0F, 0xE1, 0x9A, 0xC2, 0x1B,
0xAC, 0xFA, 0xA8, 0x0D, 0x44, 0xD4, 0x85, 0xAD, 0x18, 0x56, 0x2D, 0x6D, 0xBA, 0x58, 0x0F, 0x03,
0x37, 0x89, 0xAE, 0x13, 0xFD, 0xBA, 0xAE, 0xC1, 0x09, 0xE1, 0xED, 0x6E, 0xB2, 0xBB, 0x64, 0x56,
0x39, 0xC6, 0xEA, 0x43, 0x3D, 0xD1, 0x49, 0xF2, 0xDF, 0xF0, 0xA3, 0x72, 0xA2, 0x7F, 0xF4, 0x89,
0x95, 0xDF, 0x4D, 0x7E, 0xB3, 0xF7, 0x14, 0x1D, 0x75, 0x1B, 0x68, 0x24, 0xD0, 0xB2, 0xA2, 0x2C,
0xF5, 0x5C, 0x4F, 0xD8, 0xA2, 0x0D, 0xBA, 0xE7, 0xF4, 0xC0, 0xCE, 0xD2, 0x0E, 0x12, 0xA2, 0x84,
0x56, 0x7C, 0x83, 0x9C, 0x70, 0x10, 0xFD, 0xA9, 0xE6, 0x4C, 0x4F, 0x5C, 0x3C, 0x19, 0xBF, 0x92,
0xF9, 0x57, 0x57, 0x84, 0x26, 0xA2, 0x47, 0x6F, 0xE3, 0xB7, 0x23, 0xEC, 0xB5, 0x38, 0x25, 0x47,
0x1F, 0x84, 0x6A, 0x18, 0xF8, 0xBF, 0xBE, 0x46, 0xD1, 0xC6, 0x8C, 0x04, 0xFA, 0xDD, 0x72, 0x6A,
0xFB, 0xA8, 0x83, 0xD8, 0xD4, 0x80, 0xFD, 0xF9, 0x73, 0x06, 0x55, 0x30, 0xFE, 0x6C, 0x34, 0x33,
0x90, 0xA8, 0xDF, 0xC6, 0x61, 0x7B, 0x96, 0x4D, 0x73, 0x34, 0x31, 0x67, 0x59, 0x9B, 0xDF, 0xC1,
0xDE, 0x0D, 0xB6, 0x77, 0xD6, 0x9B, 0x19, 0xCC, 0x3F, 0x66, 0x25, 0xED, 0x5A, 0x4E, 0xAB, 0x69,
0xD7, 0x93, 0x2B, 0x2A, 0xAE, 0x00, 0x50, 0x3E, 0x57, 0xE1, 0xF5, 0xEC, 0xA0, 0x2D, 0xB4, 0x0E,
0x82, 0xB4, 0xE2, 0x6D, 0xA7, 0xC2, 0xF3, 0x6A, 0x13, 0x65, 0xA1, 0xED, 0x37, 0x5E, 0xB4, 0x35,
0xED, 0x89, 0xF5, 0x54, 0xC5, 0x00, 0x67, 0x82, 0x9B, 0xA9, 0x02, 0x4B, 0xCE, 0x29, 0xD3, 0xB9,
0xA2, 0xDF, 0x4C, 0x8E, 0x81, 0x8B, 0x7F, 0x05, 0x7D, 0xF6, 0x44, 0x86, 0x2C, 0xBA, 0x5A, 0x78,
0x7D, 0xF6, 0x07, 0x40, 0x0C, 0xD5, 0x58, 0xB7, 0xF2, 0x8D, 0x18, 0x3E, 0xDE, 0xBC, 0x57, 0x86,
0x9A, 0xCB, 0x94, 0x2C, 0x7C, 0xC8, 0x4C, 0xBC, 0x05, 0x94, 0x15, 0xFE, 0x7B, 0x0F, 0x47, 0x1E,
0x08, 0xE8, 0x72, 0x96, 0x3E, 0x43, 0x53, 0x15, 0x3B, 0x12, 0x71, 0xAE, 0xF6, 0x90, 0xD8, 0x3D,
0x01, 0x3B, 0xC3, 0x6A, 0x5B, 0x0E, 0xB6, 0xFC, 0x3C, 0x27, 0x23, 0xDB, 0x75, 0x32, 0x1C, 0x90,
0x47, 0x81, 0xDE, 0xF8, 0xD1, 0x5A, 0xEB, 0x32, 0xE8, 0x06, 0x84, 0xC8, 0x1C, 0x10, 0x14, 0x82,
0x8A, 0x44, 0xD8, 0x7A, 0x75, 0x8A, 0x06, 0x95, 0x06, 0x36, 0xD6, 0x82, 0x15, 0xBD, 0xBD, 0xA9,
0x43, 0xB8, 0x88, 0x5F, 0x23, 0xA5, 0x01, 0xDC, 0xDF, 0xF4, 0x19, 0x1E, 0x48, 0x1E, 0xAD, 0x35,
0x0E, 0xBD, 0x1D, 0x72, 0x49, 0x92, 0x49, 0x06, 0xA3, 0x22, 0x5D, 0xBA, 0x82, 0xBE, 0xA9, 0x37,
0x5E, 0x1A, 0x0C, 0x99, 0x25, 0x7F, 0x02, 0xC9, 0x73, 0xE9, 0xD2, 0x90, 0xBA, 0x01, 0xEA, 0x41,
0x58, 0x03, 0x10, 0xE8, 0x98, 0xC6, 0x53, 0xA8, 0x12, 0x86, 0x47, 0x98, 0xA3, 0x43, 0x23, 0x44,
0xAA, 0x09, 0xC5, 0x69, 0x9B, 0x7F, 0xD9, 0xB3, 0x97, 0x24, 0x72, 0xB7, 0x48, 0xA7, 0x43, 0x71,
0x39, 0x68, 0x2E, 0xD0, 0x2C, 0xE7, 0x3D, 0xCB, 0x41, 0x76, 0xB3, 0x6B, 0xFE, 0x78, 0xA9, 0x53,
0x00, 0xC5, 0xCC, 0x90, 0x5A, 0xEB, 0x42, 0x17, 0x18, 0x74, 0x20, 0xAC, 0x81, 0xEE, 0x4A, 0xC6,
0x01, 0x0D, 0x7B, 0x43, 0x56, 0xF2, 0x51, 0xBE, 0x88, 0xF9, 0x13, 0x9F, 0x83, 0x77, 0xC4, 0x19,
0x25, 0x81, 0xF4, 0xD9, 0x07, 0x2E, 0x18, 0xE6, 0x8C, 0xF3, 0x4B, 0x8F, 0x66, 0xB4, 0x40, 0x02,
0xEE, 0x00, 0x56, 0x11, 0xA7, 0x1E, 0xEE, 0x71, 0x2A, 0xC5, 0x95, 0x9D, 0xC4, 0x3A, 0xC1, 0xAE,
0x64, 0x99, 0xBF, 0x23, 0xCB, 0x96, 0x60, 0x8A, 0x34, 0x7D, 0x02, 0x95, 0x3D, 0xCA, 0xD4, 0x60,
0xE5, 0x61, 0xC0, 0x1D, 0x8B, 0x9F, 0xEA, 0x7F, 0x49, 0xF4, 0xCF, 0xFB, 0x60, 0x27, 0xA8, 0x6D,
0xD8, 0x16, 0xD4, 0x1C, 0x3C, 0x17, 0x2E, 0xDB, 0xCE, 0x5A, 0x15, 0x1B, 0x17, 0x9D, 0xDA, 0xB1,
0x4A, 0x7C, 0x76, 0x94, 0x0F, 0xE5, 0xC6, 0xDA, 0x34, 0x30, 0x6E, 0x9F, 0x40, 0xEE, 0x1E, 0x94,
0xB4, 0x22, 0x42, 0x4A, 0x28, 0xBB, 0x4F, 0x2B, 0x39, 0xB5, 0x09, 0x3E, 0xDC, 0x16, 0xE8, 0xAD,
0xFE, 0x69, 0x4F, 0xCC, 0x56, 0x19, 0x8D, 0xF7, 0x48, 0x79, 0x3F, 0x9B, 0x5D, 0xD0, 0x5C, 0x06,
0x3A, 0x94, 0xE1, 0xFD, 0x58, 0x42, 0x0D, 0x68, 0x0E, 0x4E, 0x4C, 0xCD, 0x49, 0x25, 0x25, 0x87,
0x75, 0xF2, 0xB7, 0xD7, 0x2A, 0x88, 0x25, 0xC3, 0x87, 0xC4, 0xC8, 0x9F, 0x43, 0x86, 0x92, 0x19,
0xA6, 0xE2, 0x87, 0x20, 0xBD, 0xF0, 0x97, 0x4A, 0x43, 0xC3, 0x0D, 0x09, 0x51, 0xF3, 0x0F, 0x70,
0x52, 0x68, 0x7D, 0x71, 0x95, 0x7E, 0x8D, 0xAA, 0xE5, 0xDF, 0x87, 0xB6, 0x71, 0xEE, 0x96, 0xA9,
0x80, 0xF8, 0xA9, 0x8F, 0xF5, 0x73, 0x26, 0x5F, 0x8D, 0x7A, 0xFC, 0x0A, 0x2E, 0x0E, 0x18, 0xE8,
0xBD, 0x7F, 0xB1, 0x5D, 0x9A, 0xDC, 0xBE, 0xC6, 0x44, 0x36, 0x83, 0xFF, 0x09, 0xD8, 0xFD, 0x08,
0xAA, 0xFD, 0x57, 0x18, 0xFD, 0x4B, 0x27, 0x25, 0x5C, 0x73, 0x8A, 0x76, 0x94, 0xFD, 0xBD, 0xA5,
0xC6, 0x55, 0x98, 0x4A, 0x1B, 0x3D, 0x83, 0x54, 0xCF, 0x66, 0xEC, 0x46, 0x45, 0x21, 0x83, 0x30,
0xA8, 0x70, 0xBC, 0x00, 0xC9, 0x6F, 0x41, 0xF3, 0x24, 0xC8, 0x73, 0xD2, 0xEB, 0x42, 0x5D, 0x16,
0x4A, 0x9F, 0x2D, 0xF2, 0xAC, 0x74, 0xD0, 0xA7, 0x15, 0xA5, 0x4E, 0x1B, 0xDE, 0x0E, 0xC7, 0x8D,
0xC0, 0x93, 0x04, 0xB8, 0x55, 0xF8, 0x2E, 0xCD, 0xA4, 0x04, 0x60, 0x41, 0x13, 0xFA, 0x84, 0x86,
0x31, 0x61, 0x08, 0xA1, 0x0B, 0xCB, 0x7E, 0x92, 0x46, 0xA8, 0x36, 0x84, 0x6D, 0x74, 0x8A, 0x2A,
0x2E, 0x6F, 0x29, 0xCD, 0x0F, 0xA7, 0x20, 0x6A, 0x50, 0x62, 0x5D, 0xB7, 0x6E, 0x7F, 0x52, 0x26,
0x04, 0x5D, 0xC8, 0x3D, 0xAA, 0x44, 0xAF, 0x8E, 0x67, 0xB9, 0x99, 0xAA, 0x65, 0xB5, 0x19, 0xDD,
0x2F, 0x3C, 0xC6, 0xB3, 0x29, 0xA2, 0x1E, 0xA8, 0x2F, 0xAC, 0xBB, 0x38, 0x27, 0xF4, 0x5D, 0x00,
0x0E, 0x2E, 0xDD, 0xBF, 0xD3, 0x10, 0x0E, 0xF7, 0x9F, 0x71, 0xEA, 0x34, 0xB4, 0xE7, 0xE3, 0x1A,
0x58, 0xF1, 0xAF, 0x94, 0x97, 0x5A, 0xDC, 0x07, 0x8B, 0x27, 0x45, 0xE7, 0x03, 0xAD, 0x1A, 0x78,
0x44, 0x10, 0xB1, 0xF3, 0xA2, 0x0A, 0x20, 0x9F, 0x31, 0xB1, 0x43, 0x0C, 0x55, 0xBE, 0x2F, 0x70,
0x94, 0x8D, 0x2F, 0x76, 0x37, 0x8F, 0x77, 0x8B, 0x25, 0xCC, 0x7E, 0x12, 0x23, 0xEE, 0x8B, 0x87,
0x01, 0xA0, 0x86, 0x1E, 0x3D, 0xDD, 0xF8, 0x1B, 0x2A, 0x7C, 0x1F, 0xF7, 0xFF, 0x08, 0xD2, 0x07,
0x14, 0x0E, 0xDF, 0xA7, 0x95, 0xA5, 0x5E, 0x51, 0xA3, 0xE2, 0x1C, 0x72, 0x55, 0x65, 0x9D, 0xD7,
0x42, 0x01, 0x6F, 0x52, 0x36, 0xDE, 0xA7, 0x31, 0x80, 0x6C, 0xA4, 0x07, 0x65, 0xA3, 0x5E, 0x90,
0x0D, 0xB8, 0x3B, 0xCE, 0x1B, 0x50, 0x35, 0xF0, 0xA3, 0x36, 0x01, 0x95, 0x7B, 0x0A, 0xAF, 0xBC,
0x87, 0x60, 0x78, 0xFA, 0x04, 0x69, 0x7B, 0x0E, 0xA7, 0x05, 0xF8, 0xB7, 0x0E, 0x97, 0xC5, 0xBB,
0x97, 0x2E, 0xF7, 0xEA, 0xE3, 0xE6, 0x65, 0x30, 0xC7, 0x95, 0x10, 0xB7, 0x0B, 0xEE, 0x9E, 0x6B,
0xBC, 0xF2, 0x53, 0xF4, 0xA1, 0x49, 0x30, 0xA2, 0x65, 0x2A, 0x70, 0xC8, 0x68, 0xBF, 0x57, 0xFE,
0xA1, 0xEA, 0xE1, 0xE7, 0x38, 0x18, 0x0E, 0xDC, 0xD1, 0x96, 0x8B, 0xD0, 0x16, 0x98, 0x96, 0xD4,
0x4E, 0x8B, 0x1D, 0xB0, 0xE0, 0x42, 0xA2, 0x45, 0x37, 0xF4, 0xE2, 0xA9, 0x3D, 0xBF, 0x2A, 0xFA,
0xF9, 0x22, 0x1C, 0x3F, 0x2F, 0xAA, 0x5F, 0xE8, 0xDE, 0xAF, 0xFD, 0x9E, 0x26, 0xB0, 0x55, 0xC1,
0x63, 0x2E, 0x87, 0x55, 0x4E, 0x58, 0x24, 0x80, 0x51, 0x04, 0xA6, 0x71, 0x33, 0xC9, 0xFD, 0xA6,
0xB8, 0x5F, 0xE0, 0xC7, 0x40, 0xD1, 0x1D, 0x71, 0x11, 0xB6, 0x29, 0xC3, 0x39, 0x8D, 0xE6, 0xFE,
0x3E, 0x1C, 0xD2, 0xAD, 0x3D, 0xA7, 0x32, 0x08, 0xC2, 0x5D, 0xE9, 0x83, 0x93, 0x9E, 0x4A, 0xA3,
0xAE, 0x18, 0xE8, 0x20, 0x55, 0x11, 0x04, 0x11, 0x88, 0x49, 0xBB, 0xE0, 0x2F, 0xDA, 0x05, 0xAE,
0x0B, 0x0D, 0x85, 0x03, 0x81, 0x56, 0x37, 0xC5, 0x1A, 0x8D, 0xB3, 0xC2, 0xE4, 0x9D, 0x1E, 0xEF,
0x1C, 0x6E, 0x6C, 0x96, 0xD0, 0xCF, 0x50, 0xE2, 0x18, 0x18, 0x65, 0x4C, 0xFA, 0xD7, 0x65, 0x4A,
0x33, 0x2A, 0x9E, 0x7A, 0x7F, 0xBB, 0x07, 0x05, 0xE6, 0xEA, 0x17, 0x8C, 0xB3, 0x5F, 0x14, 0xBA,
0x03, 0x49, 0xC5, 0xE8, 0x3E, 0x46, 0x87, 0x3E, 0xB8, 0x3F, 0x5C, 0x7E, 0xC5, 0x6B, 0x96, 0xDF,
0x0A, 0xCB, 0xA6, 0x4C, 0xBC, 0x5C, 0xF5, 0x36, 0x34, 0x51, 0x9A, 0x7B, 0xED, 0x7E, 0x74, 0xC5,
0xB2, 0x55, 0xA2, 0x1F, 0x1F, 0xEA, 0x6B, 0x51, 0x17, 0x54, 0x74, 0x27, 0x81, 0x81, 0xE2, 0x7F,
0x47, 0x39, 0x28, 0x6D, 0x0F, 0xF3, 0x15, 0x50, 0x85, 0x57, 0x7D, 0x5C, 0xD0, 0x30, 0xDA, 0x79,
0x19, 0x8D, 0x7C, 0x46, 0x07, 0xA3, 0xB7, 0xDE, 0x86, 0x4B, 0xAB, 0x16, 0x4B, 0x64, 0xC6, 0x80,
0xE8, 0x5F, 0x64, 0x8C, 0xC7, 0x94, 0xB2, 0x16, 0x96, 0x48, 0x9F, 0x98, 0x3B, 0x74, 0x7F, 0xD0,
0xCF, 0xC9, 0xC8, 0x21, 0x07, 0x9A, 0x13, 0x22, 0x4D, 0x1E, 0xD6, 0x7D, 0x0C, 0x81, 0xEA, 0xFD,
0x76, 0x93, 0x20, 0xB0, 0x45, 0xAC, 0x14, 0xAB, 0xB6, 0x7B, 0x18, 0x18, 0x7E, 0x25, 0x44, 0xB4,
0x49, 0xDA, 0xFB, 0x4D, 0x8C, 0x2B, 0x4A, 0x52, 0x78, 0x9A, 0xA1, 0xF6, 0x19, 0xF7, 0x08, 0x68,
0xAB, 0x18, 0x62, 0x8B, 0xF4, 0x39, 0xFD, 0xBF, 0x75, 0x1D, 0x75, 0x0E, 0xC3, 0x4D, 0x41, 0x1D,
0xE1, 0xF4, 0x39, 0xF2, 0x72, 0x62, 0xD2, 0x38, 0xE7, 0xA3, 0x78, 0xF3, 0x8F, 0x18, 0x55, 0x0C,
0xBB, 0xE1, 0x57, 0x49, 0x0A, 0x03, 0xDD, 0x3B, 0xC5, 0xB5, 0xB8, 0x4F, 0x74, 0x40, 0x16, 0xE1,
0xE9, 0x27, 0xBA, 0x0D, 0x0F, 0x97, 0xEB, 0xCF, 0x3B, 0x55, 0x4C, 0x3E, 0x2B, 0xD5, 0x9D, 0x71,
0x61, 0xC5, 0x8E, 0xBB, 0x9C, 0xC7, 0x80, 0x9F, 0xBE, 0x27, 0x90, 0xCA, 0x1B, 0xFD, 0x1F, 0x7D,
0x2D, 0x7B, 0xB8, 0x2F, 0x83, 0x04, 0x95, 0x75, 0x39, 0x09, 0xCC, 0x76, 0xA9, 0x78, 0x9C, 0x18,
0x84, 0x5A, 0x7C, 0xE3, 0x10, 0xA5, 0xB0, 0xCA, 0xC9, 0x18, 0x8F, 0xB1, 0x8E, 0xFB, 0xA8, 0x8F,
0x06, 0x31, 0xE7, 0x2F, 0xF4, 0x5F, 0x24, 0xA6, 0x20, 0x31, 0x47, 0x69, 0x39, 0xD0, 0x3E, 0xFE,
0x4B, 0x93, 0x79, 0x24, 0x95, 0x9D, 0x14, 0xB0, 0x34, 0x5C, 0xE4, 0x39, 0xBE, 0xF0, 0xA5, 0xD9,
0x0F, 0x4D, 0xB6, 0x46, 0x30, 0x75, 0xC5, 0x10, 0x59, 0xF1, 0xFB, 0x5C, 0xC3, 0x5F, 0x7F, 0xA1,
0xE6, 0xF3, 0x03, 0x73, 0x95, 0x19, 0xDE, 0x91, 0xAB, 0x7F, 0x24, 0xA7, 0x80, 0xDD, 0x54, 0x3F,
0x92, 0x09, 0x10, 0x56, 0x4B, 0x89, 0x18, 0x2E, 0x91, 0x3A, 0x46, 0xA5, 0xDC, 0x52, 0x38, 0x0D,
0x9D, 0x2F, 0xD8, 0x08, 0xA6, 0x0A, 0x6B, 0x87, 0x94, 0x16, 0x2C, 0x26, 0xD0, 0x9F, 0x32, 0x4C,
0xB3, 0x73, 0x84, 0xFB, 0xAF, 0x47, 0xC1, 0xAA, 0x9E, 0x67, 0x21, 0x9F, 0xEC, 0xB8, 0xE9, 0xB3,
0xB0, 0x51, 0xD8, 0x56, 0xD8, 0xF2, 0xF1, 0x1C, 0x78, 0x5A, 0xA2, 0x21, 0xC7, 0x3E, 0xA3, 0x2E,
0x90, 0xC5, 0x87, 0x7B, 0xF5, 0x4E, 0x68, 0x0B, 0x7A, 0xE1, 0x03, 0x24, 0x05, 0x2D, 0x0F, 0x63,
0x02, 0x6A, 0x46, 0xF3, 0x0B, 0x6E, 0x32, 0xF8, 0x79, 0xD0, 0x88, 0x9A, 0x41, 0x46, 0xC1, 0x18,
0x89, 0x0E, 0xC2, 0x17, 0x19, 0x79, 0x79, 0x1B, 0x3C, 0x05, 0xAD, 0x85, 0x8F, 0xD6, 0x20, 0x86,
0xAD, 0x24, 0x28, 0x89, 0x1C, 0x0E, 0xE1, 0x00, 0x80, 0x59, 0x91, 0x1E, 0xF5, 0x5E, 0xE7, 0xC1,
0x98, 0x46, 0x25, 0xF9, 0xD5, 0x4D, 0xE5, 0xD7, 0x06, 0x9B, 0x84, 0xF3, 0x4B, 0x10, 0xB0, 0xB7,
0x40, 0xE5, 0x31, 0xEF, 0xC7, 0x88, 0x03, 0xB0, 0x2A, 0xAA, 0xA0, 0x4E, 0x0F, 0x93, 0x47, 0xC5,
0x39, 0xE2, 0x5D, 0x0B, 0xA6, 0xB9, 0x34, 0x12, 0x9D, 0x48, 0x08, 0x46, 0x77, 0xB8, 0x38, 0x97,
0x03, 0x77, 0xF0, 0x84, 0xD4, 0x30, 0xC4, 0xA4, 0xC2, 0x9F, 0x01, 0x65, 0xF1, 0x79, 0xC3, 0x84,
0xBF, 0xDD, 0xD6, 0x6B, 0x03, 0x30, 0xA8, 0x38, 0xCF, 0x24, 0x61, 0xF0, 0x63, 0x83, 0x5C, 0xB5,
0x38, 0x26, 0x5C, 0x1D, 0x38, 0xFF, 0xC7, 0x94, 0x9A, 0xC0, 0x8E, 0x6C, 0x34, 0xCE, 0x93, 0x9F,
0xE4, 0x3E, 0xA8, 0xD5, 0x44, 0x50, 0x66, 0xB3, 0x37, 0x4A, 0x61, 0xCD, 0x85, 0x04, 0x35, 0x3C,
0x7D, 0xFD, 0x06, 0x06, 0xE5, 0x14, 0x1D, 0x73, 0xF0, 0x5E, 0x9F, 0x94, 0x3A, 0x6C, 0xA2, 0xB3,
0xED, 0x82, 0xF9, 0x9D, 0x41, 0x61, 0x99, 0x0E, 0xBD, 0xDD, 0x79, 0x1D, 0x98, 0xE9, 0x4D, 0x89,
0x62, 0xF1, 0x6F, 0x7B, 0xF6, 0xA6, 0x30, 0x62, 0x85, 0xF9, 0x74, 0xE8, 0xCC, 0xEF, 0x5C, 0xBA,
0x0A, 0xF8, 0x5E, 0xD2, 0xB9, 0x73, 0x1E, 0x8D, 0xF7, 0xC4, 0x85, 0x05, 0x28, 0x96, 0x0C, 0x32,
0x47, 0xB6, 0xE0, 0x19, 0xC0, 0x97, 0x89, 0x25, 0xB7, 0xDC, 0x7A, 0xE3, 0x59, 0x72, 0xBB, 0xB0,
0x02, 0xFD, 0x23, 0xBE, 0x67, 0x0B, 0x80, 0xBF, 0xD7, 0x02, 0x3C, 0xD1, 0x8D, 0xD3, 0xD1, 0x1E,
0x5B, 0xA8, 0x87, 0x08, 0x12, 0xBD, 0x55, 0x88, 0x26, 0xD7, 0x5A, 0x93, 0x55, 0x0E, 0x2D, 0x21,
0xFD, 0x13, 0x7C, 0x4D, 0xA7, 0x8A, 0xD9, 0x6A, 0x50, 0x21, 0x26, 0x62, 0xA6, 0xD0, 0x2C, 0xA4,
0x62, 0x07, 0x73, 0xEF, 0x6D, 0x5F, 0x4E, 0x7B, 0x17, 0x77, 0x05, 0xBA, 0x7F, 0x6F, 0x3F, 0x29,
0xB4, 0x1F, 0x20, 0x37, 0x12, 0x47, 0xC2, 0xAC, 0x4A, 0xAE, 0x92, 0x01, 0x90, 0x55, 0xE5, 0xFD,
0x1C, 0x3F, 0xBB, 0xFF, 0x26, 0xA3, 0x50, 0xA4, 0x98, 0xC6, 0x00, 0x74, 0x22, 0x59, 0xBB, 0x26,
0x04, 0xB3, 0x97, 0x68, 0xCC, 0x4A, 0x92, 0x6E, 0xF5, 0xEA, 0x93, 0xD6, 0x09, 0x76, 0x30, 0x29,
0xA9, 0x4F, 0x9D, 0xB8, 0xAF, 0x62, 0x48, 0x79, 0xE7, 0xE8, 0x9D, 0xB5, 0x07, 0x7A, 0x0C, 0xF4,
0x35, 0xBF, 0x82, 0x47, 0xA0, 0xD9, 0x61, 0xF3, 0x77, 0x3C, 0xCD, 0x9A, 0xF8, 0xE8, 0x8C, 0x77,
0xA0, 0x1F, 0xE8, 0xF6, 0x40, 0xB2, 0x1B, 0x57, 0x45, 0xBD, 0x09, 0x28, 0x1F, 0x99, 0xE2, 0x2E,
0x06, 0x1A, 0xA9, 0x0D, 0xDC, 0x4B, 0xAB, 0xE9, 0xBA, 0x53, 0x3E, 0x00, 0xC7, 0x42, 0xC7, 0xE1,
0xFF, 0x65, 0xEA, 0x96, 0xD3, 0x07, 0x6D, 0x56, 0xAD, 0x2A, 0x57, 0x5C, 0x62, 0x57, 0x5C, 0x50,
0x15, 0x49, 0x26, 0x3B, 0x54, 0xF6, 0x78, 0x92, 0x47, 0x2A, 0xC3, 0x2B, 0x22, 0xC6, 0xA7, 0xA9,
0x97, 0x80, 0x1B, 0x46, 0xCA, 0x97, 0x05, 0x2B, 0xB6, 0x78, 0xFC, 0x8F, 0x2D, 0x6D, 0x50, 0xD6,
0x38, 0xC3, 0xE5, 0x36, 0x2B, 0x99, 0x71, 0x58, 0x65, 0xA8, 0x09, 0x5C, 0x2F, 0xD4, 0x95, 0x03,
0xBA, 0x36, 0x1C, 0x1D, 0x18, 0x65, 0xD4, 0x40, 0xE4, 0xD9, 0x64, 0x85, 0x3A, 0x83, 0x18, 0x06,
0xF1, 0x04, 0x37, 0xFC, 0xCE, 0x19, 0x2E, 0x81, 0xB2, 0xA1, 0xD9, 0xBF, 0xD1, 0x4D, 0x01, 0x24,
0xA2, 0x40, 0x4A, 0x00, 0xC9, 0x24, 0x08, 0xD9, 0xD5, 0xEF, 0x6E, 0xCF, 0x4C, 0x82, 0x45, 0x64,
0x52, 0x4E, 0x89, 0x50, 0x86, 0x25, 0x54, 0x28, 0x21, 0x0B, 0x1D, 0x44, 0x60, 0xD3, 0x02, 0x96,
0x13, 0xDA, 0x22, 0x95, 0x1D, 0xBD, 0x65, 0xAB, 0xE2, 0x4A, 0x1D, 0x72, 0x0A, 0x3D, 0x0F, 0xF4,
0x3D, 0xB0, 0x75, 0x6D, 0x66, 0xF5, 0x65, 0x2B, 0xA3, 0xB7, 0x4C, 0xAD, 0x84, 0xC4, 0xF8, 0xF2,
0xC5, 0xE4, 0xED, 0x0B, 0x11, 0xD2, 0xB9, 0x8C, 0x1B, 0x17, 0x57, 0x7C, 0x61, 0x5F, 0x12, 0xD8,
0x12, 0xFA, 0x2B, 0xF7, 0xF1, 0x68, 0x9F, 0xD0, 0x73, 0x19, 0x03, 0xEA, 0xAC, 0xF1, 0x74, 0x39,
0x5B, 0x31, 0xE6, 0xD0, 0x7D, 0x8C, 0x29, 0x3C, 0x8D, 0x53, 0xB7, 0x89, 0xC1, 0xA7, 0x49, 0x9F,
0xC1, 0x66, 0x3D, 0xA6, 0x75, 0xC2, 0xDA, 0x9A, 0x58, 0xCC, 0x48, 0x36, 0x08, 0xE7, 0x54, 0x5B,
0x5E, 0x2D, 0xC9, 0x3B, 0x35, 0x06, 0x8D, 0xC9, 0x1D, 0x04, 0xE3, 0xBE, 0x7B, 0x25, 0xFA, 0x6D,
0x70, 0xA7, 0x7A, 0x69, 0xA0, 0x0B, 0x4D, 0xC2, 0xCE, 0x66, 0xD6, 0x8D, 0x23, 0xBA, 0xE9, 0x30,
0xA7, 0x00, 0x7A, 0x13, 0x91, 0x1A, 0x74, 0xEB, 0xB8, 0x9C, 0xF9, 0xDD, 0x15, 0x86, 0xF2, 0x46,
0xAB, 0xD0, 0x46, 0x9A, 0x52, 0xA6, 0xAA, 0x4C, 0x92, 0xF7, 0x4C, 0x4C, 0x07, 0x15, 0xBF, 0xCF,
0x48, 0x25, 0xA4, 0x7A, 0x06, 0x7D, 0x81, 0x71, 0x49, 0x06, 0x19, 0x4D, 0x62, 0x96, 0xE1, 0x0B,
0xBD, 0xA1, 0xE0, 0x8E, 0x99, 0x9E, 0xB0, 0xC8, 0x50, 0x18, 0x7A, 0x1D, 0x0C, 0x9E, 0xFA, 0x54,
0xBF, 0x33, 0xE2, 0x79, 0x53, 0xB8, 0xC5, 0x0B, 0x5F, 0x88, 0xD7, 0x34, 0x92, 0x1F, 0xD3, 0x62,
0x52, 0x7B, 0x47, 0xB8, 0xF9, 0x15, 0xB4, 0x9A, 0xBF, 0x84, 0x56, 0xAA, 0x3D, 0xBF, 0x64, 0xDC,
0xC2, 0x04, 0xD3, 0x93, 0x59, 0x51, 0x71, 0xBA, 0x3B, 0x1B, 0x25, 0x5C, 0x8C, 0xEC, 0x38, 0x12,
0xD9, 0xC1, 0x8F, 0x58, 0xD8, 0xE1, 0x33, 0x83, 0xE7, 0x9A, 0xB0, 0x84, 0x92, 0xB4, 0x90, 0xFA,
0xCB, 0x7D, 0xAC, 0x96, 0x59, 0x39, 0xD2, 0x39, 0xB5, 0x9D, 0x5D, 0x2C, 0x97, 0xC3, 0xB2, 0xB6,
0x50, 0xFA, 0x1D, 0xCE, 0x79, 0xCB, 0xAF, 0x53, 0x46, 0x5F, 0xD5, 0x62, 0x0A, 0x96, 0xB9, 0x3A,
0xD8, 0xF2, 0x5A, 0xEC, 0xF9, 0x42, 0xFA, 0x00, 0xEC, 0x79, 0x9E, 0x3E, 0x70, 0x3B, 0x31, 0xA9,
0x9B, 0x14, 0x56, 0x41, 0x56, 0x78, 0xA5, 0xB3, 0xEC, 0xB0, 0x7C, 0xA6, 0xA4, 0x0F, 0x6E, 0x49,
0xFA, 0x40, 0x2D, 0xA4, 0x0F, 0xA2, 0xFD, 0xE9, 0x83, 0x7D, 0x7E, 0x05, 0x00, 0x73, 0xBB, 0x51,
0xFE, 0xE3, 0x72, 0x6E, 0x3F, 0x60, 0x40, 0x2E, 0x62, 0x7A, 0xC3, 0x77, 0x73, 0xB5, 0x91, 0xA0,
0xD7, 0x0B, 0x7E, 0x45, 0x82, 0x3E, 0x06, 0x1F, 0x8A, 0x72, 0x32, 0x19, 0xA8, 0xD9, 0xC3, 0xE8,
0xBF, 0xD9, 0xD2, 0x2A, 0x72, 0x6A, 0xA0, 0x91, 0x5F, 0x5A, 0x58, 0x88, 0x25, 0x14, 0xDE, 0x49,
0x28, 0x9C, 0x71, 0x21, 0xD8, 0x5B, 0x92, 0xE9, 0x7A, 0x99, 0xBD, 0x65, 0xF8, 0xC1, 0x6D, 0x29,
0x2F, 0xE1, 0x4F, 0x24, 0x84, 0x27, 0xFA, 0x31, 0xCE, 0x8B, 0x2A, 0x4C, 0x80, 0x3C, 0x32, 0x3E,
0xA7, 0x73, 0x8E, 0x5E, 0x13, 0xB0, 0x27, 0x6E, 0x36, 0x95, 0xFF, 0xAF, 0x4C, 0x38, 0xB3, 0x75,
0x34, 0x2E, 0x29, 0x5E, 0x90, 0xA6, 0x0D, 0xDE, 0xB5, 0x86, 0x9C, 0xC4, 0x74, 0xBC, 0xB7, 0x79,
0xCB, 0xFF, 0x47, 0x59, 0x2C, 0xAD, 0x50, 0x32, 0x55, 0xFA, 0x3B, 0x9E, 0x20, 0x1C, 0xE4, 0x96,
0x62, 0xE1, 0x45, 0xD3, 0x0C, 0x8E, 0x98, 0x88, 0x7F, 0xB8, 0x1B, 0xC8, 0x24, 0x2B, 0x7C, 0x3E,
0xF7, 0x3C, 0xFD, 0x32, 0xEE, 0x39, 0xB0, 0x8C, 0x3E, 0xA0, 0x71, 0xCF, 0x59, 0xCC, 0x21, 0x0A,
0x2F, 0xC4, 0x94, 0xEB, 0xE7, 0x94, 0x96, 0x8D, 0xF2, 0xF6, 0xD7, 0x76, 0x7D, 0x3B, 0x53, 0x4E,
0xD0, 0xAB, 0x2F, 0x57, 0xBE, 0x60, 0x22, 0x8B, 0x05, 0x35, 0x74, 0xA9, 0x91, 0xD9, 0x3D, 0x51,
0xEC, 0x71, 0xE4, 0x4C, 0xA6, 0xB1, 0x87, 0x91, 0x38, 0x3F, 0x77, 0xF3, 0xD0, 0x2E, 0x4D, 0x45,
0x78, 0x7F, 0x0D, 0x23, 0x89, 0x69, 0x69, 0x38, 0x5A, 0xDC, 0x0A, 0x1F, 0xB3, 0x3F, 0x07, 0x85,
0x61, 0xA6, 0xFE, 0xD9, 0xF9, 0xAB, 0x5F, 0xE0, 0x75, 0x03, 0x6C, 0x70, 0x95, 0xF9, 0xAB, 0xC6,
0xE4, 0xAF, 0x9E, 0x32, 0x37, 0xDB, 0xD8, 0xBA, 0x86, 0x93, 0x87, 0xE5, 0xAF, 0x9C, 0xF3, 0x5F,
0xCC, 0x39, 0xFE, 0x16, 0x39, 0xE7, 0xFB, 0x30, 0x87, 0xEB, 0xB8, 0x35, 0x10, 0x79, 0x9C, 0x69,
0xEB, 0x1C, 0x7F, 0x56, 0xDB, 0xB8, 0x84, 0x7F, 0x84, 0x73, 0x2C, 0x5C, 0x92, 0xEC, 0x88, 0x13,
0xBF, 0x92, 0x19, 0xA7, 0x1E, 0x13, 0x35, 0x3B, 0xDA, 0xD7, 0xFD, 0xFC, 0x8F, 0x92, 0xF7, 0x17,
0xFC, 0xF4, 0x18, 0x1A, 0x54, 0xEA, 0x3D, 0xD3, 0xF6, 0x65, 0x69, 0xFA, 0xFC, 0x21, 0x41, 0xB8,
0x3D, 0x1F, 0x7C, 0x13, 0x91, 0xCB, 0x4C, 0x14, 0x7E, 0xAA, 0x02, 0x61, 0x25, 0xCC, 0x3A, 0x47,
0x83, 0xD7, 0xAB, 0x8B, 0xB3, 0xA5, 0x85, 0xC7, 0xF7, 0xEA, 0xE2, 0xF6, 0x9B, 0xCF, 0xAC, 0x02,
0x29, 0x4C, 0x91, 0xD9, 0xBB, 0x53, 0x58, 0x70, 0x05, 0x73, 0x05, 0xF7, 0xE6, 0x0D, 0x81, 0x55,
0x5C, 0x9D, 0xEE, 0x0B, 0x0B, 0xD6, 0x9C, 0x21, 0x74, 0xA0, 0x23, 0xE2, 0xA7, 0xE8, 0x05, 0x13,
0xD4, 0x21, 0xBF, 0xA3, 0xF8, 0x7E, 0x7B, 0x31, 0x81, 0x77, 0xD2, 0xD4, 0x8A, 0x4A, 0xA9, 0x28,
0x2B, 0x45, 0xA5, 0x50, 0x94, 0x75, 0xA2, 0x52, 0x26, 0x9A, 0x48, 0x0C, 0xCE, 0x18, 0x4E, 0x79,
0x73, 0x9B, 0x15, 0xA2, 0x99, 0x29, 0x10, 0x95, 0x56, 0x32, 0x5B, 0xDD, 0xC5, 0xE2, 0xD0, 0x6C,
0xB4, 0x29, 0x2E, 0x47, 0xC0, 0x9A, 0x05, 0x3C, 0xB5, 0xB7, 0x7D, 0x01, 0x6D, 0x3A, 0x95, 0x19,
0xCE, 0x77, 0x94, 0x11, 0x20, 0xD6, 0xDF, 0x89, 0xB8, 0x0F, 0x8B, 0xC2, 0x16, 0x61, 0xED, 0x33,
0x2D, 0x1D, 0xDB, 0xB4, 0x3A, 0xDE, 0x0B, 0x46, 0x39, 0x6B, 0xB4, 0xD9, 0xA5, 0x72, 0x86, 0xDF,
0x99, 0x5A, 0x91, 0x6C, 0x5F, 0xAD, 0x88, 0x21, 0x2E, 0xC2, 0x64, 0xA6, 0x32, 0xAF, 0xC9, 0x63,
0xB5, 0x2E, 0xEB, 0xE4, 0xB3, 0xAA, 0x93, 0x5F, 0x67, 0x88, 0x34, 0xC9, 0x25, 0x44, 0x6A, 0x14,
0x24, 0x59, 0xC8, 0xF5, 0x38, 0xC6, 0xBD, 0x78, 0x55, 0x8E, 0x2F, 0xA9, 0xAF, 0xB4, 0xB4, 0xA5,
0x35, 0xCC, 0x0D, 0x9D, 0x3E, 0x89, 0xD9, 0x87, 0xB0, 0x0A, 0x27, 0xE2, 0xA8, 0x0F, 0x06, 0x6A,
0x53, 0x1B, 0xA8, 0xD5, 0x7B, 0x02, 0xB5, 0x19, 0x9C, 0xF0, 0x73, 0x0C, 0xD4, 0x0E, 0xD2, 0x0C,
0x5A, 0xFB, 0xFD, 0x86, 0x45, 0xA8, 0x4C, 0x9B, 0x9E, 0x7C, 0x91, 0x0A, 0x46, 0x35, 0xAF, 0x0C,
0xA9, 0x8C, 0x59, 0x00, 0xCE, 0x77, 0x86, 0xBE, 0x88, 0xA8, 0x53, 0xEE, 0xCA, 0x58, 0xE7, 0x21,
0x8B, 0x23, 0x24, 0x98, 0x65, 0x32, 0x66, 0x5B, 0x53, 0xA1, 0x9E, 0x40, 0xBA, 0x39, 0xFC, 0xC0,
0x84, 0x61, 0x54, 0x11, 0x8C, 0x69, 0x51, 0x52, 0xD2, 0xC8, 0x7E, 0xE5, 0x9E, 0x98, 0x40, 0x95,
0xBC, 0x9B, 0x0A, 0xFD, 0x95, 0x94, 0x8D, 0x60, 0x9C, 0x23, 0x05, 0x63, 0x39, 0x2B, 0x52, 0x7C,
0x50, 0x51, 0x58, 0x6A, 0x7F, 0x31, 0xD8, 0x27, 0x66, 0xE3, 0x8A, 0x59, 0x0E, 0x31, 0x18, 0xAC,
0xED, 0xD0, 0xB9, 0x37, 0x88, 0xF9, 0x4C, 0x41, 0xB4, 0x48, 0x3A, 0xC9, 0xF0, 0xE8, 0x87, 0xA8,
0x64, 0xF9, 0x34, 0xF3, 0xE4, 0x1C, 0xE6, 0x27, 0x1F, 0x48, 0x71, 0x2E, 0xC9, 0x1B, 0x07, 0x1B,
0xDE, 0xCB, 0x52, 0x9C, 0xBC, 0xCB, 0xB9, 0x6C, 0xE8, 0xD5, 0x2E, 0xC3, 0x4A, 0x86, 0xF7, 0x3C,
0xE1, 0x1E, 0x09, 0x83, 0x7F, 0x81, 0x94, 0xA8, 0x68, 0xB5, 0xD6, 0xA9, 0xB0, 0xA5, 0x27, 0x2E,
0xF5, 0x86, 0xE7, 0x31, 0x98, 0x0C, 0xA8, 0x9B, 0x60, 0x30, 0x3F, 0xC4, 0x05, 0xFF, 0x81, 0x2D,
0x63, 0x02, 0x9E, 0xE6, 0x92, 0xA7, 0x08, 0xEF, 0x6D, 0xF0, 0x04, 0x0C, 0xF6, 0x93, 0xD6, 0x12,
0x33, 0x56, 0xC6, 0xA9, 0x3E, 0xD0, 0x65, 0x74, 0x55, 0x5C, 0x5A, 0x0D, 0xE9, 0xC2, 0x4C, 0x27,
0x15, 0x24, 0x5F, 0x33, 0xED, 0xD4, 0xA2, 0x5B, 0x1E, 0x5D, 0xF7, 0x80, 0x93, 0x1E, 0xD9, 0x92,
0x48, 0x6F, 0x9B, 0xC5, 0x91, 0xAC, 0x46, 0x37, 0x8B, 0xD3, 0x64, 0xA2, 0x71, 0x2C, 0xDB, 0x61,
0x19, 0x48, 0x13, 0xEE, 0x2B, 0xDB, 0xD1, 0x92, 0x3A, 0xC4, 0x8A, 0xAB, 0x08, 0xAE, 0x22, 0xA4,
0x80, 0xE1, 0x0F, 0x96, 0x60, 0xBB, 0xC5, 0xDE, 0x34, 0xDD, 0x71, 0xB4, 0x17, 0x56, 0xF0, 0x26,
0xDB, 0xEF, 0x6E, 0xBF, 0x8E, 0x81, 0xFA, 0xB4, 0x2C, 0x15, 0x9D, 0x02, 0x45, 0xD6, 0xAF, 0x46,
0x26, 0x6B, 0xFC, 0xDA, 0xBA, 0xE5, 0x8C, 0xFC, 0xB8, 0xC4, 0xB9, 0x24, 0xCD, 0x06, 0xBF, 0x25,
0x7D, 0xA1, 0xE5, 0xCB, 0x29, 0x5B, 0x1C, 0xC4, 0xCD, 0x8B, 0x10, 0x89, 0xEA, 0x8A, 0x0C, 0xE3,
0x8A, 0x94, 0x00, 0x9E, 0x81, 0x6C, 0xC9, 0xDD, 0xC2, 0xD4, 0x4A, 0x17, 0xC6, 0xB2, 0xAE, 0xEC,
0x38, 0x58, 0xA6, 0x2D, 0x28, 0x6A, 0xB0, 0x34, 0x16, 0x50, 0xA4, 0x5F, 0x2F, 0x74, 0x96, 0x43,
0x12, 0xB5, 0x71, 0x06, 0xE9, 0xAF, 0x29, 0xF3, 0x05, 0x8E, 0x30, 0x7C, 0xD0, 0xD2, 0x43, 0xA7,
0x56, 0x29, 0x87, 0x90, 0x58, 0x84, 0x00, 0xEB, 0x7E, 0x99, 0x20, 0x00, 0x20, 0xAA, 0x80, 0x00,
0xAF, 0xE0, 0x8B, 0xA6, 0xB1, 0x21, 0x54, 0x86, 0xBC, 0x55, 0x2F, 0x4E, 0xE5, 0x86, 0x92, 0xC1,
0x40, 0xB8, 0x3A, 0x25, 0xA3, 0x89, 0x47, 0xAF, 0x75, 0xA0, 0xF2, 0xAD, 0x54, 0xF7, 0x3C, 0xF9,
0x6D, 0x54, 0xF7, 0x70, 0xF4, 0xD5, 0x2E, 0xD2, 0x89, 0xB2, 0x48, 0x55, 0xB2, 0xC5, 0x3C, 0x5F,
0xBD, 0x78, 0xE0, 0xFF, 0xD7, 0xF4, 0x04, 0xCB, 0x09, 0xD4, 0x6E, 0x4C, 0xAC, 0x4B, 0x5C, 0x9F,
0x97, 0x04, 0x50, 0x65, 0xFC, 0x70, 0xAF, 0x6A, 0x06, 0x54, 0xA5, 0xC3, 0xB3, 0x46, 0xFA, 0x1A,
0x9A, 0xDE, 0x9B, 0x0F, 0x2F, 0x99, 0x0F, 0x76, 0x70, 0xD3, 0x07, 0x99, 0x00, 0x49, 0x6E, 0xF1,
0x32, 0xE6, 0x05, 0x0E, 0xFD, 0xD9, 0x51, 0x1F, 0x5C, 0x93, 0xFF, 0xB4, 0xD3, 0xC1, 0xC1, 0x82,
0x20, 0x56, 0x89, 0x78, 0xFB, 0xC9, 0x45, 0xA9, 0x19, 0x5D, 0x16, 0x2B, 0x27, 0x6F, 0xBF, 0xEF,
0x99, 0xFB, 0xC8, 0x3D, 0x8F, 0xAE, 0xCC, 0x70, 0xE1, 0x42, 0xB0, 0x4D, 0x4F, 0x9A, 0x94, 0xC0,
0x85, 0x44, 0x5C, 0xAF, 0x49, 0x17, 0x33, 0xEB, 0x5B, 0x95, 0xF3, 0x6E, 0xA8, 0x7E, 0xEE, 0x75,
0x25, 0xFB, 0xBE, 0x3C, 0x2F, 0xDF, 0x30, 0xBE, 0x69, 0x06, 0x9B, 0xCB, 0x97, 0x91, 0xAD, 0x28,
0x29, 0xCC, 0x95, 0x61, 0x2D, 0x57, 0x3A, 0xBD, 0xB9, 0xD2, 0xD6, 0xBF, 0x1B, 0x2B, 0x63, 0x64,
0x9C, 0x2C, 0xA0, 0x80, 0x95, 0x19, 0xD5, 0x26, 0x86, 0x8A, 0x66, 0xE2, 0x74, 0xB1, 0xB8, 0xC0,
0xA6, 0x54, 0x03, 0x63, 0x04, 0x23, 0x23, 0x17, 0x36, 0x78, 0x9B, 0xD5, 0x36, 0x48, 0x2B, 0x43,
0x69, 0x65, 0xB7, 0x0C, 0x69, 0xB9, 0xE4, 0x60, 0x2C, 0xE5, 0xB7, 0x33, 0x20, 0x12, 0xB0, 0xC6,
0xAE, 0x4A, 0x98, 0x03, 0x5F, 0xED, 0x48, 0xFD, 0x6D, 0x92, 0x8A, 0x2B, 0x0E, 0xB2, 0x9E, 0xDB,
0xC2, 0x07, 0x13, 0x1B, 0xB2, 0x85, 0x10, 0x14, 0x92, 0x32, 0x94, 0xDC, 0x8C, 0x35, 0x7C, 0x8E,
0x31, 0xC3, 0x41, 0xB5, 0x60, 0x0C, 0xC5, 0xE3, 0x81, 0xAB, 0x2A, 0x3D, 0x8E, 0xAD, 0x99, 0x64,
0x78, 0x83, 0x80, 0xE8, 0x76, 0x01, 0x2B, 0x97, 0x7C, 0xDC, 0x75, 0x55, 0x0D, 0x59, 0x1E, 0xE2,
0x46, 0xBD, 0x0B, 0x1C, 0x08, 0xEA, 0x55, 0xD0, 0x91, 0xCC, 0x67, 0x11, 0x41, 0xC3, 0x60, 0x50,
0x62, 0x7C, 0xD4, 0x7E, 0xFE, 0xB6, 0xE6, 0xDB, 0x4D, 0xF8, 0xAC, 0x55, 0x50, 0xDE, 0xC2, 0xD5,
0xBD, 0x04, 0xC8, 0xD3, 0xB8, 0x0C, 0xAF, 0xD6, 0xE0, 0x0F, 0x9B, 0x5B, 0xCA, 0x83, 0x1D, 0x9C,
0x9D, 0x0F, 0xA4, 0x98, 0xD7, 0xD7, 0xFF, 0x9D, 0x49, 0x2C, 0xCC, 0xDE, 0xE9, 0xD7, 0x5B, 0xB5,
0x0C, 0xD0, 0x5F, 0x0E, 0xEF, 0xB4, 0xAB, 0x7E, 0xB5, 0x09, 0x2F, 0x29, 0xFC, 0xA0, 0xEC, 0xBD,
0x4F, 0x30, 0xDF, 0x3D, 0x56, 0x22, 0xC1, 0x32, 0x84, 0x3F, 0xA9, 0x6E, 0xFA, 0xB7, 0xBB, 0xE8,
0x6A, 0x9D, 0xB8, 0x4F, 0x1A, 0xE0, 0x56, 0x73, 0x92, 0xEC, 0xD2, 0xD5, 0x7F, 0xD7, 0x2D, 0xD6,
0x89, 0xF9, 0xAC, 0x13, 0xCB, 0xD5, 0x3A, 0x6C, 0xDE, 0xFA, 0xF3, 0xD4, 0x89, 0xB1, 0x9C, 0x3B,
0x1C, 0x67, 0x6B, 0x9E, 0x16, 0xEA, 0x7A, 0xCD, 0x54, 0x5D, 0xD9, 0xD7, 0xFF, 0x20, 0x4D, 0xAD,
0x4C, 0xB9, 0xD5, 0x3C, 0x1D, 0x95, 0x98, 0x74, 0x54, 0xEE, 0x7D, 0x50, 0xED, 0x4D, 0x47, 0x71,
0x76, 0x81, 0xB8, 0x21, 0xD7, 0xF7, 0x37, 0x7D, 0x84, 0x91, 0xAE, 0xED, 0x48, 0x33, 0xCB, 0xEA,
0x58, 0x24, 0xDC, 0xB0, 0x48, 0x4D, 0x5D, 0xFD, 0xD7, 0x5A, 0x8A, 0x66, 0xC6, 0x28, 0xBC, 0x67,
0x6B, 0xCA, 0x48, 0xBD, 0x2A, 0x65, 0x2E, 0xEA, 0x4B, 0xE6, 0xC7, 0x1A, 0x13, 0x6D, 0x21, 0xFE,
0xBF, 0x85, 0x57, 0x25, 0xFE, 0x81, 0x3A, 0x46, 0x5F, 0x21, 0xD3, 0xA1, 0x14, 0x83, 0x25, 0xDC,
0x3D, 0xC3, 0x42, 0x0D, 0xCE, 0x2E, 0xF3, 0xD1, 0xA0, 0x2C, 0x90, 0x28, 0xFA, 0xF5, 0x09, 0x77,
0x09, 0xF8, 0xB5, 0xA4, 0xA3, 0xB6, 0xA6, 0x0A, 0x36, 0x77, 0x54, 0x07, 0xC2, 0x34, 0xEA, 0x40,
0xAD, 0x4D, 0x23, 0xF5, 0x6C, 0xAC, 0xC5, 0xA0, 0xA9, 0xD1, 0x43, 0xA0, 0x1F, 0x8C, 0xB0, 0x51,
0xB0, 0xE8, 0x65, 0x9C, 0x32, 0x77, 0xE0, 0xB4, 0x42, 0x7D, 0xA3, 0x7C, 0xD5, 0xD8, 0xDB, 0x9B,
0xBC, 0xF5, 0x55, 0x2C, 0xC5, 0xC7, 0xB8, 0x74, 0xA3, 0xB5, 0x66, 0x73, 0x54, 0xCF, 0xA8, 0x70,
0x89, 0x47, 0xE3, 0xB8, 0x81, 0x7F, 0xE9, 0x11, 0xCA, 0x5D, 0x0C, 0x50, 0xE1, 0xA0, 0x92, 0x1A,
0x7D, 0x1A, 0x18, 0x25, 0x45, 0xA5, 0x60, 0x86, 0x5B, 0x34, 0x3B, 0xEC, 0xCB, 0x55, 0x8A, 0xCC,
0x5D, 0xF2, 0xD2, 0x07, 0xB9, 0xDD, 0x0A, 0x20, 0x90, 0x26, 0x87, 0x23, 0x53, 0x6E, 0x4B, 0xB2,
0x1D, 0x4D, 0x33, 0x98, 0x1B, 0xE8, 0x7B, 0x1C, 0x06, 0xF8, 0x7C, 0x19, 0xE5, 0x5E, 0x2D, 0x16,
0xF7, 0x26, 0x4B, 0x68, 0xF3, 0x15, 0x33, 0x8C, 0x0D, 0x12, 0xC5, 0xAB, 0xA0, 0xFC, 0x1F, 0xD7,
0x26, 0xCC, 0x16, 0x74, 0x66, 0x9F, 0x86, 0x38, 0x7F, 0x87, 0x0F, 0x43, 0x8A, 0x5C, 0xCB, 0x6F,
0xBA, 0x40, 0x6F, 0x4E, 0xFB, 0xBB, 0xA9, 0x56, 0xD1, 0x98, 0x41, 0xB3, 0x83, 0xE2, 0xC7, 0xCF,
0x9B, 0x5E, 0xAC, 0x98, 0x5E, 0x54, 0x7B, 0xD3, 0x8B, 0xD6, 0x95, 0x10, 0x1B, 0xBB, 0x3C, 0x59,
0x55, 0xC6, 0x50, 0x55, 0xAA, 0x25, 0x94, 0x4F, 0x53, 0x92, 0xE8, 0x37, 0x7E, 0x06, 0x6A, 0xD2,
0x8B, 0xF7, 0x40, 0x6B, 0xC7, 0x1A, 0x2E, 0x46, 0xDB, 0x04, 0xC7, 0x4F, 0x5A, 0xEB, 0x90, 0x4C,
0x8E, 0xA2, 0xF1, 0x15, 0xAD, 0xF6, 0x3E, 0xCF, 0x17, 0x52, 0x56, 0x1B, 0x48, 0x11, 0x88, 0x1C,
0xB5, 0xD9, 0xF3, 0x53, 0xED, 0x46, 0x64, 0x6C, 0x91, 0x59, 0x6C, 0x5C, 0x22, 0x13, 0x7B, 0xA9,
0xA1, 0x78, 0x81, 0xFE, 0x00, 0xFD, 0x2C, 0xBA, 0x9B, 0xD9, 0x65, 0xA7, 0xF7, 0xCF, 0x35, 0x20,
0xE6, 0x6F, 0x25, 0x21, 0xE6, 0xD7, 0x6B, 0xF2, 0xF0, 0x88, 0x2D, 0x89, 0x07, 0xDE, 0xC6, 0xF3,
0x1B, 0x57, 0x73, 0x17, 0xCB, 0x90, 0x8F, 0x3F, 0xD9, 0x25, 0x1C, 0x26, 0x23, 0x98, 0xB2, 0x4C,
0xB1, 0xFF, 0x26, 0xCA, 0x14, 0xE7, 0x3D, 0x59, 0xD9, 0xEB, 0x31, 0x48, 0x97, 0xBE, 0xF7, 0xA5,
0x33, 0xB7, 0x83, 0xEC, 0x2A, 0xB5, 0xFB, 0x93, 0x0C, 0xCC, 0xD5, 0x76, 0x83, 0x0E, 0x63, 0x13,
0x86, 0xF7, 0xA4, 0xB6, 0x18, 0xD3, 0x7D, 0xE6, 0x28, 0x97, 0x39, 0xCA, 0x65, 0x8E, 0x72, 0x99,
0xA3, 0x5C, 0x8F, 0xE6, 0xA3, 0x7C, 0x8C, 0x3B, 0xF1, 0xDC, 0xC2, 0x61, 0x61, 0x94, 0x91, 0xD4,
0x22, 0x9B, 0x51, 0x26, 0x23, 0xC7, 0x91, 0x67, 0xED, 0xBE, 0x71, 0x84, 0x78, 0xD3, 0xC3, 0x16,
0x72, 0x53, 0xA6, 0xC4, 0x33, 0x1C, 0xFD, 0x80, 0xD5, 0x83, 0x54, 0xD4, 0xF9, 0x80, 0x0A, 0xD1,
0x5F, 0xA9, 0xB7, 0x93, 0xFD, 0x7B, 0x46, 0x56, 0x0E, 0x3F, 0x1C, 0xB3, 0x5B, 0xE4, 0x64, 0xB7,
0x90, 0x6C, 0x90, 0x93, 0xFD, 0x71, 0x9F, 0xB3, 0x88, 0x3C, 0xC4, 0xDC, 0x1D, 0x97, 0x71, 0x73,
0xDC, 0x52, 0x63, 0xA3, 0xD1, 0x12, 0x26, 0x5B, 0xCC, 0x95, 0x4C, 0x00, 0xDB, 0xC3, 0x9E, 0x79,
0x4F, 0x4C, 0x00, 0x1A, 0x14, 0xA2, 0x86, 0x13, 0x32, 0xA8, 0xE8, 0xB9, 0x12, 0xF7, 0xBB, 0x05,
0x29, 0x26, 0x48, 0x2A, 0x9B, 0x7B, 0x1D, 0x3D, 0x2B, 0x64, 0x6F, 0xD3, 0x40, 0xAD, 0x08, 0xFE,
0xEF, 0x59, 0x2A, 0xD1, 0x5B, 0xDC, 0xA3, 0xA0, 0xAF, 0xDA, 0x5C, 0x10, 0x69, 0xAA, 0x10, 0x81,
0x6C, 0x36, 0x9B, 0xA5, 0x0B, 0x3B, 0xB0, 0xA4, 0x8A, 0xC2, 0xD4, 0x3E, 0x1B, 0x2D, 0x32, 0x59,
0xC1, 0x44, 0x8A, 0xA1, 0xF5, 0xF5, 0x4B, 0x15, 0x23, 0x01, 0x1D, 0x97, 0xE4, 0x5F, 0xC4, 0xBB,
0x36, 0xC0, 0x8D, 0x01, 0x38, 0x5E, 0xE7, 0x75, 0xBF, 0xD8, 0x54, 0xD1, 0xBD, 0xD7, 0x2B, 0xD5,
0xB3, 0xF1, 0xBB, 0x42, 0xED, 0x17, 0x65, 0xC9, 0x30, 0xB3, 0x8C, 0xC5, 0x1A, 0xFA, 0xFA, 0x0D,
0xEA, 0x70, 0x0A, 0x4C, 0xCE, 0xED, 0xD6, 0x37, 0x29, 0x23, 0x54, 0xC5, 0x75, 0x9C, 0x8C, 0x73,
0x97, 0xA1, 0x3A, 0x74, 0x9F, 0x49, 0xF4, 0xCD, 0x33, 0xD4, 0xFC, 0xA7, 0xEC, 0x5A, 0xD2, 0xCA,
0x30, 0x7E, 0x05, 0x0C, 0xC8, 0x58, 0xB5, 0x20, 0xB6, 0x94, 0xAE, 0xD3, 0xAE, 0xF2, 0x27, 0x82,
0x7D, 0xDD, 0x6E, 0xA8, 0x56, 0xD2, 0x4A, 0xF0, 0x98, 0x8F, 0x5F, 0xE3, 0xD0, 0x07, 0x26, 0x29,
0x70, 0x4F, 0x47, 0x52, 0x15, 0xC6, 0x0D, 0xF5, 0x17, 0x34, 0xB9, 0x9C, 0xEB, 0x8E, 0x84, 0x51,
0xCD, 0x08, 0x73, 0xF6, 0x15, 0x8D, 0xFA, 0xED, 0x5B, 0xE0, 0x1D, 0xF7, 0xF0, 0xFB, 0xBE, 0xBD,
0x09, 0xF7, 0x94, 0x23, 0x4C, 0x64, 0x73, 0xF4, 0x5C, 0x6D, 0x2A, 0xDB, 0xA8, 0xD9, 0x0F, 0x59,
0x9F, 0x48, 0x25, 0xC0, 0xEA, 0x32, 0x1A, 0xE0, 0xB0, 0x4A, 0x3C, 0x9A, 0x5C, 0x93, 0x70, 0x7A,
0x13, 0xA8, 0xE7, 0xDE, 0xAE, 0xAB, 0xCC, 0x0E, 0x42, 0x86, 0x8B, 0x0C, 0xF4, 0x27, 0xF7, 0xF5,
0xB4, 0x5F, 0xD0, 0x6C, 0x05, 0x3F, 0xB8, 0x95, 0x70, 0xFA, 0x0B, 0x2A, 0x1F, 0xC6, 0xA3, 0x53,
0x60, 0xF6, 0x23, 0x8B, 0x57, 0xA5, 0x75, 0x20, 0x1C, 0x60, 0x9A, 0x2C, 0x81, 0x11, 0xAC, 0x15,
0xB3, 0x7B, 0x8E, 0x56, 0xCA, 0xAB, 0x12, 0x61, 0x63, 0x91, 0xD9, 0x59, 0xA8, 0xBA, 0x44, 0xC8,
0x4C, 0x20, 0x42, 0x20, 0x1D, 0x17, 0x03, 0x76, 0xAE, 0xD9, 0x14, 0x33, 0x94, 0x48, 0x3E, 0x6D,
0x10, 0x4F, 0x97, 0x15, 0xA3, 0x9C, 0x0A, 0xBF, 0x11, 0xD7, 0x5A, 0x82, 0x58, 0x31, 0x40, 0x54,
0x22, 0x66, 0xA4, 0x68, 0x0C, 0xB6, 0x7B, 0x03, 0xA7, 0x37, 0x6A, 0x18, 0xC5, 0xEA, 0x28, 0x1A,
0xAE, 0xB9, 0xAD, 0x54, 0x81, 0x7A, 0x5D, 0x6C, 0xCA, 0x27, 0x78, 0xAB, 0xA5, 0x87, 0x7B, 0xC7,
0x61, 0x82, 0x58, 0xF0, 0x19, 0x60, 0x1E, 0xC3, 0x76, 0xA9, 0xF5, 0x7B, 0xC6, 0x38, 0x43, 0x89,
0x61, 0x01, 0xF6, 0xE0, 0x73, 0x9D, 0x41, 0x3F, 0xAF, 0x36, 0xEF, 0xA0, 0x9D, 0x8F, 0x3E, 0x2B,
0xA5, 0xCF, 0x64, 0x0D, 0x57, 0xE9, 0xD4, 0x26, 0xA4, 0xCE, 0xDC, 0x5A, 0xBB, 0x21, 0x11, 0x2C,
0xF4, 0xA4, 0x65, 0x9F, 0xC3, 0x7A, 0x09, 0x9E, 0x7E, 0x92, 0x26, 0xBD, 0x83, 0x75, 0xAD, 0x19,
0x5F, 0x48, 0xE3, 0xE6, 0x72, 0x05, 0x3D, 0xC6, 0xBA, 0x9F, 0xC5, 0x02, 0x30, 0x44, 0x20, 0xDC,
0x8A, 0x54, 0x84, 0xC2, 0xD2, 0xAF, 0x8A, 0xD6, 0x31, 0xF1, 0x28, 0xDE, 0x4D, 0x56, 0xDB, 0x68,
0x3E, 0x74, 0x46, 0x6A, 0x4C, 0x0F, 0x26, 0x3C, 0x7D, 0x06, 0x10, 0x01, 0x45, 0xC1, 0x94, 0x26,
0x13, 0x69, 0xE5, 0x50, 0xFD, 0xC1, 0xD6, 0x05, 0x45, 0x9D, 0x9A, 0xCA, 0x12, 0xFE, 0xB3, 0x6E,
0xC2, 0xA7, 0x63, 0xAA, 0xEF, 0x34, 0x01, 0xAE, 0x5E, 0x97, 0xF0, 0x42, 0x7F, 0x9A, 0xF7, 0x94,
0xFD, 0xE5, 0x00, 0x01, 0x86, 0xD5, 0xCF, 0x35, 0x20, 0xFF, 0x25, 0x5D, 0x74, 0xEF, 0x53, 0x3A,
0x81, 0xE2, 0x82, 0xD0, 0xFF, 0x08, 0x4C, 0x82, 0x0D, 0xE2, 0x78, 0x9C, 0xB5, 0x9D, 0x38, 0x73,
0x2B, 0x35, 0x02, 0xC7, 0xC3, 0xB0, 0x7F, 0x47, 0xDF, 0xD1, 0x7B, 0xFB, 0xF2, 0x67, 0xED, 0xED,
0xE3, 0xDE, 0xA3, 0xBF, 0xA7, 0x11, 0x63, 0xF6, 0xB5, 0xD2, 0x25, 0xC4, 0x74, 0xD3, 0x26, 0x6F,
0x4C, 0xB6, 0xBC, 0x9F, 0xAA, 0x8A, 0x24, 0x0C, 0x28, 0x46, 0xD2, 0x49, 0x19, 0x1D, 0xFE, 0xAF,
0xCF, 0x5D, 0x1C, 0xB8, 0x3D, 0x2F, 0x0E, 0xB4, 0x8D, 0xC7, 0x56, 0x9B, 0x24, 0x4B, 0x5C, 0x8A,
0x17, 0xBE, 0xF3, 0xCD, 0x45, 0x21, 0x98, 0x65, 0xD6, 0xB9, 0x41, 0x20, 0xE3, 0xF0, 0x19, 0x6F,
0x54, 0x50, 0x3F, 0x12, 0xC0, 0x13, 0x86, 0x32, 0xCF, 0x61, 0xD1, 0xA1, 0xEE, 0x5E, 0x20, 0x14,
0xA1, 0x00, 0xFA, 0x66, 0x9F, 0xBB, 0xE0, 0xDB, 0xAD, 0x29, 0x8B, 0xCD, 0xD4, 0xDC, 0x12, 0x43,
0xA5, 0x14, 0x20, 0x3A, 0x42, 0xBF, 0xBD, 0xDD, 0x56, 0x93, 0xCF, 0x63, 0xD8, 0xA8, 0x89, 0xC4,
0x18, 0x1E, 0x26, 0x84, 0x44, 0xBD, 0xF3, 0xC2, 0x93, 0xB0, 0x10, 0x8F, 0xA1, 0x08, 0xB8, 0xCD,
0x9E, 0x04, 0x58, 0x65, 0xE3, 0x99, 0x96, 0x7D, 0xB5, 0x5F, 0x13, 0xFB, 0x3A, 0x21, 0xAE, 0x80,
0x1C, 0xEA, 0xC9, 0xCF, 0x17, 0xA7, 0x4F, 0x06, 0x2F, 0xA6, 0xC4, 0x65, 0x24, 0x33, 0xD4, 0x1F,
0xA0, 0x17, 0xF9, 0x94, 0x58, 0x96, 0x91, 0x30, 0xC6, 0x1A, 0x57, 0xA1, 0xA9, 0xEE, 0x31, 0xDC,
0x6B, 0xBF, 0x7F, 0xE4, 0x6B, 0x5B, 0x29, 0xD0, 0x5B, 0x21, 0xA7, 0x07, 0x28, 0xFA, 0xF3, 0x96,
0x41, 0x87, 0xAF, 0x61, 0x5F, 0x5F, 0xFB, 0x5C, 0xFB, 0xFA, 0xB4, 0xDD, 0xD7, 0xB7, 0xB0, 0xD1,
0xC3, 0x08, 0xBF, 0xD3, 0x2E, 0x30, 0x70, 0x5B, 0x54, 0x71, 0x46, 0x49, 0x31, 0xEF, 0x9F, 0x7D,
0x05, 0xC5, 0xBC, 0xBF, 0x96, 0xBD, 0xA5, 0x6C, 0xF4, 0x15, 0x31, 0x69, 0xE9, 0x74, 0x17, 0x59,
0x79, 0x53, 0x95, 0x77, 0x0C, 0xDD, 0x7B, 0x6C, 0x26, 0xFD, 0x73, 0xAD, 0xAA, 0xAD, 0x0D, 0x7A,
0xCC, 0x22, 0x82, 0x85, 0x44, 0xF4, 0xF0, 0x79, 0x89, 0xE8, 0xC9, 0xC9, 0x8A, 0x17, 0x89, 0x86,
0x70, 0x09, 0x79, 0x1A, 0xC5, 0x13, 0x91, 0x4A, 0xFA, 0xAA, 0x6A, 0x45, 0xD8, 0x3A, 0x37, 0x8A,
0xC2, 0xC5, 0xDC, 0x14, 0xA9, 0x15, 0x17, 0x9F, 0xA4, 0x46, 0xE8, 0x1F, 0x59, 0x09, 0xD3, 0xE4,
0xE4, 0x5E, 0xF0, 0x11, 0xC5, 0x6A, 0x60, 0x4A, 0x41, 0x35, 0x1C, 0xF1, 0x80, 0xFD, 0xC6, 0xD7,
0xB5, 0xCB, 0xA7, 0x72, 0x94, 0x91, 0x6E, 0x63, 0x26, 0x9C, 0x18, 0xDE, 0x8D, 0x4B, 0x5F, 0x73,
0xF9, 0x77, 0x13, 0xCC, 0x60, 0x2C, 0xA2, 0x8B, 0xBA, 0x62, 0x02, 0x3A, 0x5E, 0x88, 0x26, 0x2C,
0x69, 0xFC, 0x58, 0xAB, 0xEC, 0x7A, 0x4F, 0x6B, 0x27, 0x35, 0x7F, 0x69, 0xA6, 0x8A, 0x4B, 0xFA,
0x1D, 0xE0, 0x65, 0x59, 0xBC, 0xD6, 0x29, 0xFB, 0x4C, 0x19, 0x3E, 0x61, 0x46, 0x85, 0x74, 0x40,
0xD5, 0x86, 0x7F, 0x28, 0x93, 0x58, 0x9F, 0x2F, 0xB5, 0x8D, 0x22, 0x48, 0x85, 0xC0, 0x03, 0xAE,
0x43, 0x27, 0x75, 0x03, 0x52, 0x42, 0x40, 0xEB, 0x2A, 0x8F, 0x93, 0x81, 0x42, 0x98, 0xC4, 0x7E,
0xA7, 0x8C, 0x0D, 0x71, 0x4D, 0x8D, 0x07, 0x4D, 0xA6, 0x5F, 0x59, 0x17, 0xAB, 0x65, 0xD0, 0x22,
0x2A, 0xDD, 0x79, 0xA9, 0x63, 0x1D, 0x71, 0x0F, 0xC5, 0x3F, 0x6B, 0x6E, 0x5A, 0x64, 0x79, 0x1D,
0x1F, 0x7A, 0xC3, 0xD7, 0xDE, 0x52, 0x3B, 0x33, 0xE4, 0x17, 0xDB, 0x87, 0x11, 0x1A, 0x6F, 0x2E,
0x36, 0xCE, 0x64, 0x34, 0xCC, 0xD8, 0xF1, 0x4F, 0x1B, 0xEA, 0x99, 0x7F, 0xAF, 0xA4, 0x50, 0x2D,
0x27, 0x24, 0x1C, 0x6E, 0x6D, 0x38, 0xB1, 0x61, 0x9A, 0x37, 0x4C, 0x84, 0xC4, 0x6C, 0x60, 0x59,
0x95, 0xF4, 0xBA, 0xD3, 0x78, 0x2C, 0x91, 0x0A, 0x0D, 0x2D, 0xCA, 0x44, 0x68, 0xBC, 0x47, 0x33,
0xA3, 0xC0, 0xB8, 0xEA, 0x7B, 0x8A, 0x05, 0xA0, 0xEA, 0x3D, 0xF3, 0xFC, 0x06, 0xEE, 0x41, 0x1C,
0x66, 0x6B, 0xAF, 0x73, 0x17, 0xA7, 0xEE, 0x0B, 0xED, 0xCA, 0x73, 0x3C, 0x4E, 0xB1, 0xF2, 0x8A,
0xF8, 0x88, 0x86, 0x41, 0x40, 0xC2, 0x26, 0x18, 0xBD, 0x0E, 0x7D, 0x2F, 0xA3, 0xFF, 0x55, 0x8A,
0x1E, 0xC2, 0x14, 0xAE, 0x95, 0xCE, 0x5F, 0x6A, 0x56, 0x57, 0xEA, 0xDF, 0xBC, 0xE9, 0x8D, 0x30,
0xFE, 0x30, 0x03, 0xE2, 0x24, 0x93, 0x4A, 0xE0, 0xB7, 0xA0, 0xFD, 0x3B, 0x6B, 0xFA, 0xFA, 0x7F,
0x49, 0xE0, 0x2F, 0xC1, 0x23, 0xA9, 0xF8, 0x4C, 0x98, 0xF3, 0x4E, 0x6A, 0x2A, 0x5C, 0xB0, 0xE8,
0x20, 0x39, 0xB9, 0x32, 0x30, 0x97, 0x4F, 0x44, 0xE3, 0xC0, 0x73, 0x8B, 0xCE, 0xA0, 0xC3, 0x2F,
0x3D, 0xF3, 0xB9, 0x45, 0xE9, 0x61, 0x1B, 0xEC, 0x83, 0x43, 0x36, 0xD8, 0x97, 0xAB, 0x14, 0xB8,
0x31, 0x68, 0x42, 0x4C, 0xD2, 0xDA, 0xB5, 0xC3, 0xCA, 0x24, 0xFB, 0xC5, 0x32, 0x49, 0x1B, 0xD3,
0x3B, 0xA4, 0x4C, 0x92, 0x79, 0x43, 0x97, 0x1B, 0x58, 0xC6, 0x0B, 0xFA, 0x5C, 0x8B, 0xEF, 0x39,
0xF6, 0x93, 0xD6, 0x1B, 0x6E, 0x6D, 0xE6, 0x36, 0xFC, 0xA7, 0xD9, 0xEC, 0xE2, 0x62, 0x19, 0x4E,
0x88, 0x85, 0x60, 0x19, 0x8D, 0xFB, 0x69, 0xCB, 0x10, 0x32, 0xA3, 0x54, 0xB5, 0xBA, 0xE5, 0xE8,
0x0B, 0x94, 0x8E, 0xD1, 0xD4, 0x3F, 0x4A, 0x6F, 0x98, 0xB1, 0xBE, 0x53, 0x79, 0x7D, 0xCA, 0x9B,
0x33, 0xCB, 0x39, 0xEC, 0x56, 0xF4, 0x94, 0xEA, 0x69, 0xA3, 0x36, 0x6E, 0xB1, 0xD4, 0xB5, 0x38,
0x8B, 0x69, 0x0A, 0x3E, 0xE7, 0x81, 0x4C, 0xB2, 0x67, 0x33, 0xA0, 0x77, 0xB0, 0x73, 0x69, 0x80,
0x63, 0x10, 0xDF, 0x61, 0x3C, 0x2E, 0x5D, 0x78, 0x14, 0x10, 0x55, 0x25, 0x39, 0x05, 0x33, 0xAB,
0x17, 0xF7, 0xC2, 0x70, 0xEB, 0x37, 0xBA, 0x18, 0x3C, 0x60, 0x10, 0x8D, 0xFB, 0x9D, 0x92, 0x1C,
0xAE, 0xC7, 0x70, 0xA9, 0x97, 0xBA, 0x74, 0x42, 0x3D, 0x34, 0x00, 0xEA, 0xC9, 0xCA, 0xD3, 0x3D,
0xFA, 0xE9, 0xBC, 0x49, 0xD5, 0xC7, 0x12, 0x86, 0x79, 0xF8, 0x44, 0x00, 0x39, 0xCA, 0x25, 0x5E,
0x32, 0xB5, 0xAE, 0xBC, 0xC7, 0xA5, 0xF3, 0x6F, 0x80, 0x8E, 0xE4, 0xA7, 0x03, 0x83, 0x95, 0x71,
0xA7, 0xD4, 0xBC, 0xDB, 0xA2, 0xF5, 0x93, 0xDE, 0x1F, 0xA9, 0xF9, 0xCA, 0x98, 0xF5, 0x84, 0x09,
0x51, 0x9F, 0xDB, 0x90, 0xDD, 0xC1, 0x70, 0xDE, 0xAC, 0x12, 0xF3, 0x40, 0xF6, 0xBE, 0xA5, 0x7A,
0xE6, 0x46, 0xF8, 0x00, 0xAA, 0x65, 0x71, 0x79, 0x7A, 0x41, 0xE8, 0x2E, 0x2C, 0xCD, 0x83, 0x7B,
0xFA, 0x15, 0x53, 0xEE, 0x66, 0x62, 0x57, 0xDA, 0x84, 0x2F, 0xFA, 0xF0, 0xB6, 0xC4, 0x1A, 0xF3,
0x3E, 0xB2, 0x0E, 0xC0, 0x20, 0x46, 0xA5, 0xA7, 0x87, 0x13, 0x13, 0xAC, 0x72, 0xB2, 0x58, 0x5A,
0x4E, 0xA9, 0x84, 0x61, 0x46, 0x51, 0x98, 0x41, 0x19, 0x35, 0x0E, 0xEB, 0x18, 0x5E, 0x23, 0x02,
0x50, 0x01, 0x64, 0x51, 0x14, 0x67, 0x67, 0x3A, 0x9A, 0x33, 0x07, 0xFE, 0xE4, 0x99, 0x5D, 0xE7,
0x23, 0x96, 0xC3, 0xF5, 0x51, 0xB3, 0xF4, 0x10, 0x26, 0x6F, 0xCB, 0x63, 0x35, 0xD4, 0x8A, 0xC7,
0x8E, 0x47, 0x5E, 0xF9, 0x1E, 0xF1, 0xFB, 0x7D, 0x02, 0xD8, 0x47, 0x1F, 0x55, 0x93, 0x0B, 0x11,
0x5D, 0xBD, 0xDD, 0x0A, 0xFB, 0xEF, 0x59, 0x36, 0x55, 0x6E, 0x72, 0x4B, 0x5B, 0xC9, 0x62, 0x2C,
0xF2, 0xE6, 0xA8, 0x5A, 0x82, 0x9B, 0x68, 0x5C, 0x08, 0xCE, 0x2C, 0x05, 0x03, 0x33, 0xBB, 0xBF,
0x07, 0x6B, 0x63, 0x0A, 0x9D, 0xCF, 0xF5, 0xF5, 0xE2, 0x5C, 0xAD, 0x8A, 0x50, 0x72, 0xD0, 0x52,
0x27, 0x97, 0x4B, 0x56, 0x11, 0x2C, 0xA4, 0x60, 0x2C, 0x79, 0xB4, 0xD9, 0xEF, 0x29, 0x1C, 0x7C,
0x27, 0x65, 0x15, 0xAD, 0xD3, 0x8D, 0xAC, 0x84, 0xB8, 0xC0, 0xC4, 0xB6, 0x3C, 0xD8, 0xE1, 0x08,
0x79, 0x80, 0x44, 0x03, 0x17, 0xD1, 0xE9, 0xAB, 0x55, 0xD0, 0x48, 0x8D, 0xC6, 0x2A, 0xF5, 0x23,
0x1A, 0x61, 0xCE, 0x1A, 0xF5, 0x07, 0x68, 0x3C, 0x7A, 0x1F, 0xED, 0xC2, 0xCF, 0xC9, 0x2E, 0xF4,
0x21, 0x83, 0xEF, 0x1D, 0xC1, 0x92, 0x35, 0xA0, 0x7D, 0x3C, 0xBB, 0x08, 0x2B, 0x13, 0x54, 0x2F,
0xAB, 0x38, 0x3D, 0xC6, 0x52, 0x08, 0x2A, 0x17, 0xB1, 0x32, 0x02, 0x44, 0x4A, 0x85, 0xDF, 0x5A,
0x63, 0x68, 0xA6, 0xB3, 0x27, 0xBE, 0x7F, 0x06, 0xBD, 0xDB, 0x80, 0xB5, 0xCA, 0x1E, 0xAD, 0x81,
0xA6, 0xEB, 0x94, 0x3A, 0x80, 0x95, 0xBE, 0x83, 0x26, 0x57, 0x66, 0xD9, 0xB9, 0x32, 0xA8, 0x5E,
0x25, 0x39, 0xD8, 0x94, 0x2D, 0x53, 0x9E, 0x2D, 0xC3, 0xA6, 0x06, 0xF6, 0x86, 0x2D, 0x9B, 0x1A,
0x73, 0xCB, 0x2C, 0x31, 0x4A, 0x34, 0x07, 0x9F, 0x87, 0x55, 0xE9, 0x8C, 0x42, 0xAF, 0x75, 0x53,
0xCE, 0x33, 0x12, 0x9A, 0x79, 0x6A, 0x76, 0xC8, 0xBA, 0xFA, 0x12, 0x1C, 0x8D, 0x74, 0x6E, 0xB6,
0xC4, 0x2E, 0x96, 0x73, 0x89, 0xC4, 0x78, 0x92, 0xDD, 0x8D, 0x79, 0xDA, 0xFD, 0x84, 0xA7, 0xE3,
0x37, 0x70, 0xDA, 0x69, 0xC9, 0x31, 0x23, 0x80, 0x57, 0xF8, 0xBE, 0x14, 0x7B, 0x86, 0xF2, 0xF8,
0xAB, 0x4E, 0xD2, 0x40, 0x52, 0x06, 0xDC, 0xDB, 0xF4, 0xE9, 0x42, 0xBD, 0x99, 0x14, 0x06, 0xC3,
0x6E, 0xDC, 0x85, 0x4B, 0x47, 0xB0, 0x3F, 0x3E, 0x3B, 0x4F, 0x4B, 0x5E, 0x9A, 0xF4, 0xFF, 0xC1,
0xBF, 0x48, 0x97, 0x20, 0xC9, 0x60, 0x4F, 0xB5, 0x65, 0xB5, 0x52, 0x75, 0x58, 0x90, 0x7D, 0x70,
0x6F, 0xF8, 0x0D, 0x9C, 0x82, 0xCB, 0xAA, 0x7A, 0x98, 0x16, 0xEF, 0x29, 0xB9, 0x0B, 0xEB, 0x4A,
0x98, 0xC0, 0x97, 0x41, 0xC4, 0x60, 0x91, 0xDB, 0x1A, 0x2B, 0x55, 0x59, 0xA5, 0xA5, 0x70, 0x59,
0xC5, 0x3D, 0x5C, 0xC4, 0x23, 0x46, 0xA1, 0xC1, 0x81, 0xB9, 0x62, 0x0B, 0x35, 0x6D, 0x92, 0x8C,
0x93, 0xA0, 0xA6, 0xCC, 0x4D, 0xC1, 0xD3, 0xC1, 0x3D, 0x9E, 0xBE, 0xC9, 0x61, 0xF9, 0x15, 0x4F,
0xB3, 0x80, 0x3E, 0xF1, 0xA5, 0xA3, 0xAB, 0x1C, 0xED, 0x27, 0xF2, 0xB4, 0x2C, 0xB9, 0x2C, 0x91,
0x70, 0xA8, 0xDE, 0x9D, 0x04, 0x69, 0x9B, 0x99, 0x8A, 0x42, 0x9B, 0x5B, 0xAA, 0x0D, 0xD6, 0x0E,
0xF4, 0x7C, 0x44, 0x42, 0x83, 0x29, 0x8B, 0xD2, 0x8D, 0xC3, 0xA6, 0x83, 0x41, 0xC3, 0x6D, 0xD6,
0x85, 0x7E, 0xB9, 0x5D, 0x6A, 0x2D, 0x77, 0xA9, 0xD5, 0x2C, 0x83, 0x13, 0x4A, 0x20, 0xB3, 0x21,
0x87, 0x03, 0x0C, 0x41, 0xA9, 0x6F, 0xEC, 0x09, 0x10, 0x7E, 0x15, 0xA5, 0x49, 0x09, 0xEF, 0xDA,
0x83, 0x48, 0xED, 0xC5, 0x50, 0xE0, 0x33, 0x55, 0x1A, 0x8A, 0xEF, 0x40, 0x42, 0xB9, 0x0D, 0x75,
0x43, 0xB9, 0x4F, 0x59, 0xB5, 0x55, 0x8A, 0x85, 0xB2, 0xBB, 0x3A, 0xFD, 0x8F, 0x20, 0x9D, 0x6F,
0xD4, 0xB8, 0xC7, 0xF6, 0x5A, 0x19, 0x63, 0x2E, 0x03, 0x86, 0x2B, 0xFF, 0x3D, 0x94, 0xA0, 0x3E,
0xDF, 0x3A, 0x7C, 0xBD, 0xE3, 0xF8, 0xE2, 0xEB, 0x90, 0xAB, 0x61, 0x5D, 0x39, 0x4F, 0x6D, 0xFE,
0xDD, 0xEE, 0x2E, 0x65, 0xF4, 0xF7, 0xA3, 0x5A, 0x45, 0x6F, 0x54, 0xAA, 0x8F, 0x1F, 0xED, 0xAE,
0x03, 0x15, 0x4F, 0x8C, 0x0A, 0xB5, 0xEE, 0xC0, 0xF8, 0x98, 0x0D, 0xE5, 0x4E, 0xEA, 0xF0, 0xD1,
0xA5, 0x81, 0x5C, 0xBE, 0x6C, 0x81, 0xDD, 0xCB, 0xC6, 0xE2, 0x4B, 0x81, 0x79, 0xAF, 0x98, 0x39,
0xCF, 0xCC, 0xF3, 0x14, 0x17, 0xC9, 0x13, 0x81, 0x3F, 0xF8, 0x90, 0x55, 0x34, 0x0D, 0xA0, 0x76,
0xC4, 0x84, 0xC4, 0x3B, 0x97, 0x3A, 0x97, 0xA9, 0xEA, 0x00, 0xA3, 0xC1, 0x9D, 0x78, 0x57, 0xCC,
0xEA, 0x3E, 0x45, 0x3F, 0x4E, 0x9B, 0x4F, 0x86, 0x5C, 0x5D, 0x61, 0xC8, 0x81, 0x80, 0x1C, 0x95,
0xC7, 0x67, 0xB2, 0x3F, 0x27, 0x98, 0x52, 0x55, 0xDD, 0xF7, 0x31, 0x10, 0x28, 0x8D, 0x96, 0x82,
0xA9, 0x34, 0x90, 0x1A, 0xB9, 0xD9, 0x4C, 0x38, 0x9F, 0xE4, 0x2D, 0xC7, 0x23, 0x0C, 0x3D, 0x48,
0x82, 0x23, 0x4F, 0x02, 0x34, 0xF9, 0xC5, 0x30, 0xE7, 0xB6, 0xEE, 0xBD, 0xE5, 0xC4, 0xAD, 0x3C,
0x7C, 0xAC, 0x8C, 0x24, 0xEE, 0xC7, 0x1A, 0xE2, 0x46, 0x6A, 0x88, 0x5F, 0x97, 0xFD, 0xE5, 0xCD,
0xDC, 0x23, 0x92, 0xC2, 0x61, 0x1B, 0x96, 0x9D, 0x3F, 0xEA, 0xEB, 0xC7, 0x92, 0x8C, 0x34, 0xE1,
0x91, 0x6A, 0x0A, 0x9A, 0x0A, 0xA8, 0x8B, 0x57, 0xAD, 0x0F, 0xD4, 0xCD, 0xDA, 0x8A, 0xFC, 0x21,
0xD9, 0x81, 0x3F, 0x7D, 0x13, 0x8D, 0x80, 0x1C, 0x6C, 0xD1, 0x7F, 0xCB, 0xB1, 0x92, 0xAD, 0x29,
0x65, 0xDE, 0x62, 0x45, 0x56, 0xBD, 0xCE, 0x72, 0x63, 0xD8, 0x12, 0x29, 0x37, 0xFE, 0x87, 0xFD,
0xE5, 0xC6, 0x12, 0x2F, 0x58, 0x37, 0x8F, 0x8A, 0x3B, 0x41, 0x82, 0x31, 0x91, 0x44, 0xFB, 0x58,
0x0F, 0x81, 0x57, 0xC3, 0x1D, 0x04, 0x5D, 0x0F, 0x11, 0x64, 0x87, 0xD9, 0x4A, 0x9D, 0x90, 0xBB,
0xA7, 0x23, 0xFD, 0x39, 0x79, 0xA8, 0x25, 0xF7, 0x2F, 0xA5, 0x66, 0x67, 0x39, 0x5D, 0x65, 0x53,
0x05, 0x8D, 0xF3, 0x2D, 0xD7, 0x9F, 0xA3, 0xDD, 0x22, 0xF7, 0x09, 0x7F, 0x2E, 0xEC, 0x30, 0x9D,
0xE6, 0x45, 0x22, 0x07, 0xE6, 0x59, 0x23, 0xED, 0x34, 0x2D, 0x22, 0xED, 0x92, 0xA8, 0x35, 0x51,
0x25, 0x5A, 0x76, 0xE9, 0x91, 0x10, 0xB4, 0xC3, 0x34, 0xCB, 0x6E, 0x21, 0x68, 0x0A, 0x88, 0x4D,
0x9A, 0x70, 0x8C, 0xB7, 0x4C, 0xB1, 0xFC, 0x86, 0x89, 0x3E, 0x02, 0xCB, 0x53, 0x13, 0xB9, 0x8C,
0x39, 0xFB, 0xAB, 0x5C, 0x87, 0x2D, 0xB6, 0xFD, 0x69, 0x69, 0xFD, 0x38, 0x99, 0x7F, 0xF1, 0x6A,
0x56, 0xA6, 0xFA, 0x16, 0x56, 0x50, 0xBD, 0xD6, 0x1A, 0xB3, 0x2F, 0xFB, 0x08, 0xD4, 0x1E, 0x59,
0x79, 0x8B, 0xA1, 0xBC, 0x88, 0x54, 0x0D, 0xA4, 0x07, 0x6A, 0x3C, 0xD0, 0x59, 0xDE, 0x64, 0x3C,
0xCA, 0x4B, 0x7F, 0x70, 0x40, 0x92, 0xFA, 0x2F, 0x2C, 0x49, 0xC2, 0x1F, 0x45, 0x92, 0xE2, 0x67,
0x48, 0x92, 0xC4, 0xD0, 0xDD, 0xA3, 0x25, 0x49, 0xFE, 0x7E, 0xF0, 0x6D, 0x52, 0x51, 0x7C, 0xDE,
0x8A, 0x8D, 0x37, 0xCE, 0x0A, 0x0A, 0xB5, 0x1C, 0x32, 0x44, 0x94, 0x2E, 0x3E, 0x0D, 0x70, 0xEF,
0xFE, 0x53, 0x7F, 0xFF, 0xFE, 0xD3, 0xEA, 0xC5, 0xF7, 0x9F, 0x7E, 0x3E, 0x3C, 0x66, 0x60, 0x4A,
0x43, 0xA6, 0xCF, 0x7D, 0xFD, 0x19, 0x43, 0xCA, 0x93, 0x88, 0x12, 0x05, 0xFC, 0x80, 0xEB, 0x62,
0xA5, 0x29, 0x84, 0xFF, 0x58, 0x15, 0x2F, 0xB2, 0xE3, 0x93, 0x4E, 0x25, 0xFD, 0x9A, 0x64, 0x76,
0x19, 0x7C, 0x79, 0x95, 0xE5, 0x84, 0xB8, 0xBA, 0x4A, 0x94, 0xFF, 0xE5, 0xEA, 0xA2, 0x99, 0xDE,
0xD9, 0x32, 0xCA, 0xE2, 0x9B, 0x92, 0x4F, 0x56, 0x56, 0x1C, 0x7C, 0x66, 0x81, 0x73, 0xE4, 0x33,
0x0B, 0x1A, 0x7A, 0x3E, 0xD4, 0x52, 0x46, 0x8C, 0xA4, 0x34, 0x44, 0x76, 0xB9, 0xA6, 0x73, 0x9F,
0xC7, 0x7A, 0x40, 0xC6, 0x1F, 0x3A, 0x7C, 0x66, 0x28, 0xCF, 0x24, 0x92, 0x03, 0x63, 0xBB, 0x89,
0x84, 0x57, 0xBF, 0xD0, 0xA3, 0x43, 0xCC, 0x07, 0xE2, 0x5A, 0x6F, 0x9E, 0xEC, 0x87, 0x6F, 0x7C,
0xB3, 0xED, 0x84, 0x8F, 0xC7, 0xD8, 0xFF, 0xE8, 0x10, 0xF3, 0xC1, 0x37, 0x1F, 0x38, 0xE3, 0x7C,
0xD6, 0x1F, 0xFC, 0x15, 0x4D, 0xD6, 0xF3, 0x2B, 0xAD, 0xDF, 0x21, 0x17, 0xFE, 0xA2, 0x31, 0x1B,
0x91, 0x2E, 0xF5, 0xD5, 0x6F, 0x2E, 0xFD, 0x2A, 0x4B, 0xCD, 0xDF, 0x01, 0x93, 0xE8, 0x6C, 0x14,
0xD7, 0xBE, 0xFE, 0x94, 0x91, 0x6C, 0xE3, 0x18, 0xEC, 0x2B, 0x41, 0x0F, 0x41, 0xDA, 0x8F, 0x2C,
0x41, 0xBF, 0x66, 0xE2, 0xB2, 0xCA, 0xAE, 0xF2, 0xB7, 0x6E, 0x28, 0x6F, 0x90, 0x58, 0xF1, 0x91,
0xD5, 0x19, 0xA9, 0xAD, 0xCE, 0x28, 0x16, 0xAA, 0x33, 0xAA, 0xE9, 0x69, 0x93, 0xCF, 0xA8, 0xCE,
0x70, 0x0E, 0x54, 0x67, 0x38, 0x7C, 0x42, 0x4C, 0x8D, 0x6E, 0x39, 0xFB, 0xAA, 0x69, 0x24, 0x59,
0x17, 0x50, 0xE9, 0x65, 0x94, 0x92, 0xE5, 0xE1, 0x7E, 0x4E, 0xED, 0xEB, 0xDB, 0xBA, 0x8A, 0x5B,
0x81, 0x40, 0x29, 0x1D, 0xE7, 0x1E, 0x1C, 0x67, 0xA7, 0xB1, 0xF8, 0xC2, 0x7C, 0x2C, 0xFD, 0x40,
0xF5, 0x71, 0xCB, 0x50, 0x22, 0x14, 0x37, 0xCF, 0xD0, 0x07, 0x17, 0xFE, 0x77, 0x1E, 0xD6, 0xD9,
0x20, 0x5A, 0x21, 0x90, 0x38, 0xD7, 0x43, 0xE6, 0x06, 0x08, 0x3A, 0xF2, 0x88, 0x4F, 0xF2, 0xFF,
0x26, 0xA6, 0xEF, 0x41, 0x6F, 0x51, 0x9E, 0x49, 0xE7, 0xB3, 0xDE, 0x05, 0x04, 0x85, 0xBC, 0x63,
0xF4, 0x04, 0x6D, 0xE5, 0xB2, 0xC7, 0xCA, 0x42, 0x68, 0x38, 0x15, 0xD4, 0x34, 0xD6, 0x32, 0xBA,
0x9F, 0xB0, 0xE3, 0x1B, 0xB2, 0x75, 0x94, 0x4F, 0x23, 0x75, 0xA5, 0xBA, 0x74, 0x83, 0x19, 0x7A,
0xCC, 0x58, 0x41, 0x34, 0xF7, 0x60, 0x79, 0x5A, 0x79, 0xB6, 0x0D, 0x37, 0x7F, 0x26, 0x9A, 0xDB,
0x54, 0xD2, 0xAC, 0x8A, 0x73, 0xD6, 0xF1, 0xE0, 0x47, 0xC4, 0x72, 0xF7, 0x69, 0xAE, 0xFE, 0x53,
0xF1, 0x9B, 0x5C, 0xF8, 0x0F, 0xB7, 0x16, 0x7A, 0x77, 0x01, 0xC9, 0xD5, 0x4D, 0x91, 0x79, 0xB7,
0x71, 0xFA, 0x40, 0x9F, 0x2D, 0x7E, 0xAD, 0x6B, 0xDD, 0xFF, 0x7F, 0x9D, 0x55, 0xBF, 0x6F, 0x1D,
0x45, 0x10, 0xFE, 0xEE, 0x36, 0xC9, 0x06, 0xAD, 0xF1, 0xBA, 0x89, 0x28, 0x48, 0xB8, 0xC6, 0x85,
0x23, 0x39, 0xB9, 0x07, 0x49, 0xE1, 0xC2, 0xBE, 0xBD, 0xE0, 0x82, 0x02, 0x04, 0x96, 0x90, 0x45,
0x9B, 0x3F, 0xC2, 0x45, 0x0A, 0x2E, 0xEF, 0x9C, 0x14, 0x48, 0xD0, 0x50, 0x51, 0x87, 0xBF, 0x20,
0x46, 0x72, 0xE1, 0xE2, 0x25, 0xDE, 0xD8, 0x7F, 0x80, 0x97, 0xB8, 0xA0, 0x82, 0x6C, 0x1C, 0x09,
0x89, 0x86, 0xAC, 0xC2, 0x21, 0x5E, 0xC4, 0x5E, 0x96, 0xD9, 0xBB, 0x47, 0xF2, 0x88, 0x50, 0x7E,
0xED, 0xFB, 0xB4, 0x37, 0x3B, 0x33, 0xBB, 0x73, 0x3B, 0xF7, 0xCD, 0xBC, 0x0B, 0x17, 0x9E, 0x0D,
0x40, 0xEF, 0xFD, 0xC2, 0xAC, 0xD4, 0x61, 0xEF, 0x03, 0x68, 0x86, 0x19, 0x0C, 0x5E, 0xF8, 0xC0,
0xD2, 0x53, 0xA8, 0xD0, 0x68, 0x7E, 0x1D, 0x4B, 0x33, 0xAC, 0x1E, 0x2C, 0x40, 0x83, 0x81, 0x3C,
0xA2, 0xCB, 0x2B, 0x8B, 0xD8, 0xC2, 0x22, 0x04, 0x12, 0x0D, 0x15, 0x1E, 0x19, 0x2E, 0x30, 0x58,
0x64, 0xB8, 0x31, 0x88, 0xD6, 0xD7, 0x98, 0x4E, 0xAD, 0xAB, 0x70, 0x2F, 0x34, 0x93, 0xC7, 0xFA,
0xFA, 0xFA, 0x30, 0xC4, 0xE1, 0x49, 0xFA, 0x22, 0xF4, 0x43, 0xAF, 0xF7, 0x63, 0x18, 0xA6, 0x87,
0xFF, 0x7F, 0xAD, 0x97, 0x81, 0x05, 0x1D, 0x9C, 0x7A, 0x73, 0xC1, 0x4D, 0xCE, 0xFA, 0x73, 0x12,
0x61, 0xB2, 0x74, 0x7C, 0x75, 0xFF, 0x7E, 0x33, 0x52, 0xF2, 0xAE, 0x2F, 0x90, 0x33, 0x9F, 0x69,
0x2F, 0x37, 0x9B, 0x9C, 0xE9, 0x8D, 0xE7, 0x56, 0x85, 0x3A, 0x38, 0x74, 0xA3, 0x6C, 0xD5, 0x2E,
0xF3, 0x92, 0x97, 0x1B, 0xCB, 0x6C, 0xDF, 0x16, 0xD9, 0xA5, 0x66, 0x24, 0xF6, 0x9D, 0x92, 0xA6,
0xCD, 0xF7, 0x7D, 0xC1, 0x6C, 0x9E, 0xBA, 0x20, 0xEF, 0xFB, 0x2C, 0xEA, 0xEA, 0x71, 0xC5, 0xF7,
0x5C, 0x2E, 0xE1, 0x36, 0x78, 0xF9, 0xBC, 0xE1, 0xEE, 0xBF, 0x86, 0x82, 0x1D, 0x7A, 0x75, 0x60,
0x5A, 0xC5, 0xDC, 0x48, 0xDC, 0x69, 0xE8, 0xFC, 0x82, 0x69, 0x0A, 0xB1, 0x81, 0xAB, 0x40, 0x56,
0x83, 0x19, 0xA0, 0x01, 0x96, 0x71, 0xF6, 0xB3, 0x13, 0x37, 0xE9, 0x7D, 0x9F, 0xFC, 0x1D, 0xCA,
0x65, 0x94, 0x12, 0x60, 0x1A, 0x70, 0xD1, 0x82, 0xFF, 0x2E, 0xCA, 0x6E, 0x8F, 0x22, 0x89, 0xBE,
0x29, 0xE9, 0x3C, 0x50, 0xE0, 0xAC, 0xD8, 0xBC, 0xD9, 0x5F, 0x78, 0xED, 0x7C, 0x52, 0x3E, 0xB3,
0x74, 0x6E, 0xC7, 0x53, 0xFB, 0x4E, 0x6F, 0xFC, 0x4D, 0x6C, 0xDE, 0x98, 0xB6, 0x44, 0xB7, 0xFC,
0x9B, 0x27, 0x64, 0xD9, 0x3D, 0x1A, 0xCF, 0x41, 0x1A, 0x04, 0x23, 0x83, 0x09, 0xF4, 0x55, 0x43,
0x9C, 0x0C, 0x2D, 0x0D, 0xE6, 0x80, 0x2A, 0x84, 0xAA, 0x4A, 0xFE, 0xA2, 0x44, 0x3B, 0x75, 0xAF,
0xAC, 0x2A, 0x70, 0x43, 0x3A, 0x48, 0x87, 0xD0, 0xCF, 0xBD, 0x26, 0xBA, 0x45, 0xA2, 0x1A, 0xB0,
0x12, 0x67, 0x2E, 0xAA, 0x3F, 0x70, 0x66, 0xC0, 0x56, 0x61, 0x06, 0x17, 0x5F, 0x8F, 0x5F, 0x40,
0xAA, 0x93, 0xF8, 0xA3, 0x17, 0xDA, 0xFB, 0x19, 0xEF, 0xEB, 0x99, 0xD3, 0x2C, 0xD1, 0x9A, 0x4C,
0x33, 0xD1, 0xF8, 0x72, 0x81, 0xF8, 0xED, 0xF1, 0xBB, 0x7E, 0xB0, 0x70, 0x63, 0x7F, 0x6D, 0x30,
0xF7, 0x8A, 0x9B, 0xA6, 0x84, 0x23, 0x8D, 0xD9, 0xC5, 0xFE, 0x41, 0x45, 0x77, 0xF8, 0x49, 0x72,
0x74, 0x1D, 0x47, 0xB5, 0x3E, 0xD2, 0x83, 0xEF, 0x35, 0x55, 0x11, 0x79, 0x90, 0x6F, 0xAC, 0xAB,
0xD7, 0x5E, 0xE0, 0xB0, 0x66, 0x9F, 0xC6, 0xC3, 0x97, 0xB6, 0xF0, 0x43, 0x08, 0x4B, 0x5B, 0x7C,
0x76, 0x81, 0xB1, 0xAF, 0x19, 0xEE, 0x5E, 0xEF, 0x7C, 0xDE, 0x0C, 0xC0, 0x7C, 0x9C, 0xB0, 0x5B,
0x46, 0xB6, 0xD0, 0x08, 0xE3, 0xC8, 0x14, 0x1A, 0xED, 0x10, 0x3C, 0x86, 0xC5, 0x55, 0x61, 0x23,
0x71, 0x80, 0xBC, 0xF4, 0x89, 0x8D, 0x82, 0xD4, 0x2A, 0x92, 0x8A, 0x0E, 0x70, 0x52, 0x6F, 0x77,
0xDB, 0x3C, 0x73, 0xCB, 0x9D, 0xA0, 0xE0, 0x17, 0xC5, 0x63, 0x88, 0xC7, 0xC2, 0x54, 0xEF, 0xC9,
0xC8, 0x8A, 0x1F, 0xBD, 0x92, 0xF2, 0x57, 0x4F, 0x50, 0xE1, 0xE3, 0x8F, 0x6C, 0xFE, 0x95, 0xCD,
0xAF, 0x85, 0xD5, 0xBD, 0x86, 0x3D, 0x6A, 0xB8, 0x3B, 0x96, 0x6A, 0x0F, 0x4F, 0x40, 0x62, 0x15,
0x94, 0x8A, 0xF4, 0xA2, 0x43, 0xE5, 0x81, 0x26, 0x92, 0xED, 0x30, 0xC7, 0x1F, 0x38, 0x6E, 0x89,
0xBE, 0xB7, 0xD3, 0x86, 0x80, 0x15, 0xF4, 0x27, 0x21, 0x43, 0x1A, 0x3C, 0x21, 0xBE, 0xEC, 0xBB,
0x63, 0x64, 0x63, 0x24, 0x35, 0xFA, 0x91, 0xD4, 0x54, 0x33, 0xB7, 0xE4, 0x9D, 0xA6, 0xE0, 0x54,
0x9E, 0xB4, 0x5C, 0x60, 0x6E, 0x85, 0x34, 0xC2, 0x78, 0x19, 0x0B, 0xC9, 0x15, 0xDC, 0x7C, 0x29,
0xEA, 0x0D, 0xD1, 0x3B, 0x2F, 0xB0, 0x52, 0x31, 0x53, 0xC5, 0x2D, 0x86, 0x76, 0x45, 0x1F, 0x75,
0xA9, 0xA1, 0x23, 0xC8, 0x6D, 0xC4, 0xF5, 0x8E, 0x2C, 0xC9, 0xB3, 0xBB, 0x36, 0xE6, 0xA5, 0x6E,
0xB9, 0x55, 0xC9, 0x58, 0xE8, 0x15, 0x62, 0xD8, 0x7C, 0xA2, 0x3D, 0x37, 0x2D, 0x77, 0x57, 0x99,
0x23, 0x65, 0x56, 0x7B, 0xD2, 0x33, 0x93, 0x27, 0x26, 0xA6, 0x72, 0x3E, 0xAD, 0x4F, 0x4B, 0x3D,
0x62, 0xC6, 0xD3, 0x16, 0x02, 0x6B, 0x54, 0xDA, 0x64, 0x9B, 0x63, 0xD2, 0x09, 0x5D, 0x31, 0xBB,
0x92, 0xDA, 0x2C, 0x31, 0xB3, 0xD4, 0x57, 0x27, 0x83, 0x13, 0x1C, 0xF8, 0x43, 0x50, 0x77, 0xE0,
0x26, 0x67, 0x26, 0xB5, 0x58, 0xE2, 0xFA, 0x96, 0xB0, 0xBB, 0xAC, 0x11, 0x56, 0x18, 0x61, 0xB8,
0x66, 0xF5, 0x16, 0x9A, 0x64, 0x9C, 0x8C, 0xD3, 0x31, 0x05, 0xBD, 0x46, 0x41, 0x1B, 0xBA, 0x07,
0x15, 0x1A, 0xE6, 0x6C, 0xAC, 0x76, 0x2B, 0xEA, 0x45, 0xCA, 0x24, 0x55, 0x81, 0xDD, 0x39, 0x47,
0x39, 0x4D, 0x0D, 0x4D, 0xE7, 0xE8, 0x9E, 0x47, 0x06, 0x62, 0xB3, 0x15, 0xA5, 0x4A, 0x29, 0xCF,
0x3B, 0x99, 0xD9, 0xEE, 0x48, 0x0A, 0xD9, 0x35, 0x08, 0x9A, 0x04, 0x58, 0x8D, 0xED, 0xF3, 0xBC,
0xE6, 0xA5, 0xE7, 0xE5, 0x95, 0xD4, 0x8A, 0x55, 0x4A, 0xA8, 0x38, 0x49, 0x27, 0x1F, 0x2B, 0x50,
0xDC, 0xC6, 0xAD, 0x16, 0x6D, 0xDB, 0x7D, 0xAA, 0x17, 0x60, 0x14, 0x31, 0x9A, 0xC3, 0x5A, 0x7F,
0xA5, 0x2A, 0xD6, 0x3A, 0x15, 0x3A, 0x15, 0x77, 0x35, 0xDD, 0xE2, 0x4F, 0x7D, 0x4E, 0x3D, 0x22,
0xB2, 0xEC, 0x32, 0xBA, 0xA6, 0x94, 0xA1, 0x6B, 0x66, 0x91, 0x6F, 0x2B, 0xF4, 0xAE, 0xB6, 0x6B,
0x5D, 0xB8, 0xD2, 0xB7, 0xAF, 0x33, 0xE8, 0x5A, 0x98, 0x28, 0xBB, 0x36, 0x96, 0x4E, 0xB9, 0xD7,
0xBD, 0x66, 0xE2, 0xBE, 0xD3, 0xBB, 0x1F, 0x27, 0x31, 0xB3, 0xC8, 0x6D, 0x12, 0x9A, 0x34, 0x34,
0x3C, 0x34, 0x22, 0x34, 0x6F, 0x71, 0x77, 0x92, 0x92, 0xCB, 0x6C, 0x04, 0x85, 0x21, 0xC8, 0x6E,
0xD7, 0x72, 0x44, 0x4C, 0xBB, 0x3B, 0x11, 0x6A, 0x02, 0x31, 0x2A, 0x78, 0x1E, 0x4A, 0x02, 0x35,
0x30, 0x42, 0xE7, 0x80, 0xED, 0x0E, 0x25, 0x92, 0x12, 0xD3, 0xA3, 0x8A, 0x60, 0x3E, 0x82, 0x7A,
0x19, 0x21, 0x2B, 0x23, 0x62, 0x65, 0xDC, 0x7F, 0x02, 0xDC, 0x1E, 0xB6, 0x90, 0x3F, 0x85, 0x06,
0xED, 0x7C, 0x16, 0xF9, 0x5C, 0x44, 0x9A, 0x13, 0xBB, 0x29, 0xB0, 0xEF, 0x68, 0x8E, 0x21, 0x7C,
0xB2, 0x1B, 0xFF, 0xD1, 0x29, 0x77, 0x19, 0x39, 0xEB, 0x96, 0x4A, 0x89, 0x5E, 0x4B, 0xC4, 0xB2,
0x1A, 0x25, 0xFD, 0x6D, 0xA6, 0x82, 0x75, 0x51, 0x02, 0x55, 0x29, 0x35, 0x4D, 0x6E, 0x0A, 0xD2,
0x0A, 0xCB, 0x1F, 0xA3, 0x4D, 0x82, 0x97, 0x26, 0x0B, 0xCE, 0xE3, 0xDB, 0xFC, 0x80, 0x92, 0x50,
0xD1, 0xF9, 0xE9, 0xC3, 0xF8, 0x7D, 0x49, 0x48, 0x02, 0x09, 0x43, 0x8F, 0x13, 0xE1, 0x9E, 0x66,
0x61, 0xEC, 0x31, 0x24, 0x12, 0xB2, 0x06, 0x23, 0xBA, 0x99, 0xD0, 0x94, 0xD0, 0x35, 0x1C, 0x7B,
0x16, 0x86, 0x9B, 0xA4, 0x41, 0x80, 0xD2, 0xD2, 0xD1, 0xB5, 0xAA, 0xEE, 0x3E, 0x73, 0xF1, 0x10,
0x93, 0xDE, 0x09, 0xE1, 0x3B, 0x17, 0xD3, 0x39, 0x1F, 0x33, 0xFC, 0xB4, 0x7C, 0x2E, 0x4B, 0xDD,
0x64, 0x1F, 0x3A, 0x25, 0x4C, 0x2B, 0xF7, 0x1A, 0xC5, 0xBB, 0xE2, 0x53, 0xAB, 0xAE, 0x92, 0xDA,
0xD3, 0xFF, 0x56, 0x25, 0xE8, 0x91, 0xDA, 0x15, 0xFA, 0xB3, 0xA4, 0x42, 0x7A, 0x7B, 0x12, 0xE6,
0x1F, 0xC5, 0x90, 0xBF, 0x4A, 0xC4, 0x40, 0x10, 0xC6, 0xBF, 0x64, 0x8B, 0x14, 0x5B, 0xAC, 0xBD,
0x70, 0xFB, 0x06, 0xEE, 0x0B, 0x78, 0x49, 0xD0, 0x17, 0xF0, 0x0D, 0x7C, 0x11, 0xBD, 0xEC, 0xE1,
0x03, 0xF8, 0x3A, 0x82, 0x39, 0xB3, 0x60, 0x61, 0x61, 0x71, 0x11, 0x84, 0x2B, 0x1D, 0xD0, 0xCE,
0xE2, 0x02, 0x06, 0x6F, 0x4F, 0xB2, 0x19, 0xF7, 0xB4, 0xB0, 0xB5, 0x10, 0x1C, 0x3E, 0x86, 0xF9,
0xC3, 0x0C, 0x1F, 0xBF, 0x94, 0xCB, 0x82, 0x2F, 0x7A, 0x73, 0x8A, 0xBC, 0x46, 0x43, 0x29, 0x5B,
0x39, 0xC2, 0x78, 0x7C, 0x74, 0x62, 0x45, 0x95, 0xE4, 0x2E, 0x1B, 0x01, 0x9C, 0x40, 0x12, 0x34,
0xA1, 0x20, 0x5C, 0x53, 0xF2, 0x46, 0xD9, 0x2D, 0xA9, 0x63, 0x3A, 0x10, 0x54, 0xF0, 0x18, 0x05,
0x41, 0xDF, 0x92, 0xDC, 0xF2, 0xA0, 0x4A, 0x74, 0x50, 0x1E, 0xDC, 0x43, 0x3B, 0x4C, 0x77, 0x9B,
0x05, 0xAA, 0x3B, 0xA6, 0xE2, 0x05, 0x71, 0xA2, 0x47, 0xB9, 0x4D, 0x7B, 0x14, 0x41, 0xF2, 0xE0,
0xE5, 0xDA, 0x16, 0x3E, 0x65, 0x57, 0x54, 0xF2, 0x99, 0x87, 0x2C, 0x80, 0x77, 0x81, 0x8D, 0xAD,
0x71, 0x16, 0x4F, 0x35, 0x54, 0x99, 0xB9, 0x94, 0xD0, 0xE3, 0x10, 0x0A, 0xC8, 0x82, 0x60, 0x3F,
0x53, 0xF7, 0xAE, 0x9E, 0xAA, 0xF9, 0x3B, 0xC9, 0x1B, 0xE1, 0x86, 0x2B, 0xF1, 0x64, 0xF3, 0x20,
0x57, 0xEC, 0xE5, 0x16, 0xD2, 0x0B, 0xEE, 0x17, 0x6A, 0x69, 0xCF, 0xBD, 0x78, 0x6D, 0xF3, 0x82,
0xDB, 0x66, 0x80, 0x72, 0xA2, 0x4B, 0x42, 0xC6, 0x65, 0x65, 0x61, 0x74, 0x6B, 0xD6, 0x43, 0x12,
0x4C, 0x99, 0x0B, 0x52, 0xD6, 0x0B, 0xCA, 0xE1, 0x95, 0x8D, 0x8D, 0x7E, 0x08, 0xC6, 0xB3, 0x4B,
0x7F, 0x05, 0x04, 0x93, 0x84, 0x2D, 0x13, 0x3C, 0x72, 0x28, 0x2B, 0x7E, 0x0A, 0x39, 0x5E, 0x72,
0x97, 0xEC, 0x7E, 0x1C, 0xF5, 0x95, 0x72, 0xF5, 0x24, 0x8D, 0x2C, 0x4A, 0xEC, 0x4C, 0x7C, 0xA5,
0x24, 0x26, 0x0E, 0x86, 0x3B, 0xE9, 0x35, 0x2F, 0xE7, 0x5B, 0x3B, 0x85, 0x49, 0x1A, 0x70, 0xB7,
0x37, 0x83, 0x8C, 0x3E, 0xF7, 0x37, 0xDC, 0x37, 0xED, 0x9F, 0x22, 0x37, 0x4E, 0x3F, 0xCA, 0x36,
0xFA, 0xF8, 0x27, 0xE4, 0x9F, 0x2D, 0x51, 0x31, 0x4E, 0xC3, 0x30, 0x14, 0x7D, 0x89, 0x11, 0x41,
0xAA, 0x84, 0xA7, 0xB2, 0x30, 0x84, 0x03, 0x54, 0xEA, 0x05, 0x5A, 0x92, 0x23, 0x64, 0x68, 0x61,
0xE8, 0xC0, 0x11, 0xB8, 0x00, 0x90, 0x88, 0x13, 0xB0, 0x30, 0x73, 0x11, 0xA4, 0x78, 0x63, 0xED,
0x02, 0x73, 0x8F, 0xE0, 0xC1, 0x95, 0x5A, 0xC9, 0xCD, 0xE3, 0x25, 0xA9, 0x25, 0xCB, 0xEF, 0x3F,
0x7D, 0x3F, 0xFF, 0xF7, 0x5C, 0x90, 0x91, 0xA4, 0xB7, 0xBF, 0x8F, 0xAE, 0x80, 0x45, 0xC4, 0xCC,
0x78, 0x54, 0xD6, 0x01, 0x05, 0xA0, 0x12, 0x86, 0x74, 0x96, 0x44, 0xB1, 0xAE, 0x86, 0xD2, 0xF7,
0x0C, 0x2C, 0x23, 0xA6, 0xA7, 0xAA, 0x2F, 0xA1, 0xE6, 0x4B, 0x1E, 0x50, 0x50, 0x18, 0xED, 0x07,
0x32, 0x06, 0xD8, 0xBF, 0x88, 0x39, 0x5E, 0x70, 0x8F, 0x05, 0x5E, 0x45, 0x7F, 0x8F, 0x62, 0x73,
0xB2, 0x2C, 0x74, 0x7D, 0x7A, 0x5C, 0x03, 0x01, 0xA8, 0xD9, 0x69, 0x9F, 0x70, 0xB3, 0x5F, 0xC1,
0xEC, 0xA4, 0xBE, 0x05, 0x26, 0x0E, 0x17, 0x1C, 0xC7, 0x8A, 0xEA, 0x0D, 0xB7, 0x3C, 0xA2, 0x5F,
0xA9, 0x88, 0x72, 0x04, 0x0F, 0x1C, 0x18, 0x29, 0x76, 0xC3, 0x69, 0x7C, 0x12, 0x07, 0x60, 0x5D,
0x3F, 0x10, 0xFA, 0xE1, 0xAD, 0x9B, 0x8D, 0x2D, 0x75, 0x22, 0xAA, 0x34, 0xDE, 0x84, 0x9C, 0xDB,
0x36, 0x58, 0x57, 0xFF, 0x90, 0x13, 0xFA, 0x42, 0x16, 0x22, 0x96, 0xA6, 0x91, 0xAC, 0x6E, 0xF9,
0x2B, 0xB3, 0x1F, 0x04, 0x76, 0x18, 0xDD, 0x67, 0xE1, 0x1C, 0x41, 0xDA, 0x9D, 0x8D, 0xE3, 0x6D,
0xB4, 0x9B, 0x60, 0x31, 0xB6, 0x5C, 0x27, 0xBE, 0xAE, 0xA0, 0x21, 0x96, 0x4F, 0x5F, 0x72, 0x9F,
0x32, 0x30, 0xB6, 0x74, 0x02, 0xEF, 0x6C, 0x80, 0xBC, 0x2B, 0x91, 0xEB, 0x95, 0xC9, 0x71, 0xE3,
0xD2, 0xA8, 0x24, 0x6A, 0x98, 0xC6, 0x6E, 0x71, 0xD7, 0xEB, 0x25, 0xCF, 0x9F, 0x2B, 0x65, 0xC6,
0x46, 0x71, 0x86, 0x41, 0x3D, 0xD3, 0x3F, 0xA0, 0x55, 0x22, 0x49, 0xBD, 0x2E, 0x91, 0x2A, 0x1E,
0xE4, 0x7A, 0x06, 0x27, 0xED, 0xAC, 0xAF, 0xE6, 0xFB, 0x8D, 0x53, 0x83, 0x60, 0x7B, 0xC0, 0x3F,
0x8D, 0x53, 0xCB, 0x4E, 0xC3, 0x30, 0x10, 0x9C, 0x34, 0xA0, 0x48, 0x44, 0x62, 0x39, 0x70, 0x04,
0xE5, 0xCA, 0x01, 0xE8, 0x85, 0x03, 0x07, 0x07, 0x2C, 0xF1, 0x01, 0xF4, 0x63, 0x7A, 0xE0, 0xD0,
0x02, 0x1F, 0x56, 0x41, 0x44, 0x8F, 0x1C, 0xF0, 0x1F, 0xD0, 0x3F, 0x60, 0x11, 0x95, 0x40, 0xE2,
0x61, 0x66, 0x83, 0x53, 0x54, 0x09, 0x01, 0x56, 0xD6, 0xB5, 0x37, 0x99, 0x9D, 0xF1, 0x7A, 0x8A,
0x0D, 0x00, 0x7B, 0x8C, 0x7E, 0x8A, 0x7D, 0x46, 0x15, 0x63, 0x7C, 0x66, 0xBC, 0x4D, 0xB8, 0x29,
0x1B, 0x4E, 0xED, 0xC2, 0x73, 0xB2, 0xE0, 0x18, 0x23, 0x8B, 0xBE, 0x88, 0xA1, 0x72, 0xF3, 0x91,
0xAB, 0x0F, 0xDC, 0x16, 0x1C, 0xFE, 0x7E, 0x16, 0x43, 0x8D, 0x84, 0x91, 0xB5, 0x8B, 0x3E, 0xA9,
0x5E, 0x8D, 0x8E, 0x9B, 0x51, 0x0A, 0x23, 0x4C, 0x88, 0x4D, 0xFC, 0xA7, 0x38, 0x35, 0xD4, 0x6E,
0x2C, 0x63, 0xCD, 0x63, 0x83, 0xD8, 0x81, 0x07, 0x14, 0x2C, 0xA8, 0x91, 0x87, 0x6C, 0x8E, 0x39,
0x8A, 0x50, 0x03, 0x22, 0xC6, 0xC5, 0x88, 0xD3, 0x40, 0x05, 0xE2, 0x49, 0x78, 0x64, 0x72, 0x34,
0x6F, 0xBE, 0x18, 0x0F, 0xC1, 0x0A, 0xAC, 0x23, 0xE7, 0x5A, 0xBB, 0xC9, 0xD0, 0xED, 0xFE, 0xC8,
0xC8, 0xFC, 0xD8, 0x8D, 0x96, 0x18, 0x57, 0xD9, 0xA5, 0x19, 0xCA, 0x0F, 0x94, 0x57, 0xB3, 0xF2,
0xEE, 0xA8, 0x98, 0x4E, 0x83, 0xD7, 0x0D, 0x7B, 0x23, 0x80, 0x55, 0x57, 0xD3, 0x29, 0xA7, 0x15,
0x9E, 0xEF, 0x21, 0xD1, 0x68, 0xF8, 0x86, 0x7A, 0x9E, 0xDA, 0xD3, 0xAF, 0x75, 0x1F, 0x2D, 0x21,
0xB8, 0x71, 0x3C, 0x43, 0xDE, 0xD4, 0xD0, 0x1A, 0xEE, 0x38, 0x46, 0x02, 0x1A, 0xE6, 0xA9, 0x9C,
0xA7, 0x32, 0xE5, 0x19, 0xB0, 0xB3, 0x8C, 0x58, 0x6C, 0x56, 0x08, 0xF6, 0x92, 0xF1, 0x6C, 0x15,
0x34, 0xD3, 0x84, 0x66, 0x43, 0xBE, 0x1F, 0x98, 0x07, 0xAC, 0x00, 0x71, 0x03, 0x86, 0xC2, 0x31,
0x4B, 0x18, 0x1C, 0xDB, 0xE5, 0x52, 0xB7, 0x5E, 0xB8, 0x86, 0x5C, 0xB2, 0xEC, 0x2C, 0xDD, 0x60,
0x37, 0xD6, 0xCD, 0x1C, 0x97, 0x29, 0xF8, 0xE5, 0xAD, 0xDD, 0x27, 0xD7, 0x3D, 0xFB, 0xD0, 0x2E,
0xF7, 0x86, 0xA1, 0x66, 0xAC, 0x9E, 0x26, 0xA2, 0x6E, 0x98, 0xFE, 0x8B, 0x80, 0x4A, 0x7C, 0xA1,
0xEF, 0xBD, 0x07, 0x99, 0x3B, 0x7D, 0x6A, 0x84, 0xDA, 0x55, 0xF1, 0xDB, 0xCF, 0x77, 0x81, 0xCE,
0x9D, 0x45, 0x73, 0x4D, 0x9D, 0xC6, 0x66, 0x99, 0x33, 0x73, 0x32, 0x13, 0xD1, 0x12, 0xC9, 0x6C,
0xE6, 0xEE, 0x22, 0xC1, 0x06, 0x03, 0xFC, 0xC1, 0xB2, 0xA2, 0x8F, 0xF9, 0x9D, 0xB8, 0x4A, 0xA3,
0xBF, 0x90, 0x90, 0x3D, 0x2A, 0xF2, 0xB7, 0xB6, 0xAB, 0x8B, 0x31, 0xCC, 0x3D, 0x0D, 0xD5, 0xDA,
0xA7, 0xF4, 0x39, 0x79, 0x3C, 0x9B, 0x1B, 0x4F, 0x1A, 0x73, 0x18, 0xFF, 0x26, 0xCE, 0x6C, 0x16,
0x38, 0xBD, 0x13, 0xC5, 0x7E, 0x8A, 0x67, 0x03, 0xB7, 0x11, 0xBE, 0xC0, 0x9F, 0xBD, 0x57, 0x3D,
0x73, 0xDC, 0xC6, 0x19, 0x7E, 0x17, 0x90, 0x88, 0x02, 0x9E, 0xAC, 0x0A, 0xA7, 0xB0, 0x38, 0x16,
0x9A, 0x94, 0x36, 0xD1, 0xB8, 0x48, 0x71, 0x24, 0x20, 0xAB, 0x74, 0x21, 0x15, 0xA2, 0x9B, 0xFC,
0x83, 0x34, 0x6A, 0x54, 0xA8, 0x38, 0xEA, 0xE0, 0xD1, 0x64, 0x52, 0x86, 0x45, 0x66, 0x52, 0x26,
0x85, 0x9A, 0x5C, 0x0A, 0xA9, 0x48, 0xC1, 0xE2, 0x8E, 0x07, 0x8A, 0x85, 0x0A, 0x17, 0x44, 0x92,
0x22, 0x45, 0x0A, 0x21, 0x63, 0x4E, 0x3C, 0x13, 0x7B, 0xA2, 0x55, 0x04, 0x47, 0x50, 0x84, 0xBB,
0xCD, 0xF3, 0x2C, 0xB0, 0xFC, 0xB0, 0xC6, 0x63, 0xC5, 0xC9, 0x18, 0xE2, 0xAD, 0xB0, 0x5F, 0xEF,
0xE7, 0xF3, 0x7E, 0xE0, 0xA6, 0x88, 0xDC, 0x5C, 0x60, 0x68, 0x33, 0x91, 0xA0, 0xC9, 0x0A, 0x09,
0x4D, 0x52, 0x4A, 0x54, 0xE9, 0x4A, 0xE2, 0x32, 0xAE, 0x45, 0x17, 0xA1, 0xB5, 0x56, 0xDC, 0xA0,
0x3A, 0xD9, 0x11, 0xE9, 0x64, 0x26, 0x32, 0x97, 0x56, 0x24, 0x53, 0x06, 0x43, 0x50, 0x8B, 0x24,
0xF7, 0x2A, 0x11, 0xFD, 0x69, 0x29, 0x12, 0x3F, 0xC9, 0x45, 0x22, 0x0B, 0x8A, 0xE1, 0x0A, 0x43,
0xD0, 0x61, 0x90, 0x46, 0x86, 0x27, 0x3D, 0x96, 0xD4, 0xD6, 0x61, 0x35, 0xC9, 0x2F, 0x81, 0x8E,
0xC4, 0xB8, 0x75, 0x17, 0x27, 0x41, 0x21, 0x93, 0xF5, 0x17, 0x46, 0x5B, 0x1B, 0x36, 0x49, 0xDD,
0xC9, 0x56, 0x2A, 0xE1, 0x67, 0xB5, 0x6C, 0xEE, 0x48, 0x04, 0xA2, 0xB3, 0x99, 0xE8, 0x5F, 0x94,
0xCA, 0x60, 0x3D, 0xAE, 0xE2, 0x72, 0xF2, 0xA1, 0x09, 0x6C, 0x27, 0xF1, 0xEA, 0x84, 0xAA, 0xB5,
0xAF, 0x2C, 0x56, 0x40, 0x44, 0x74, 0x09, 0x0D, 0x28, 0xA4, 0x9F, 0x3C, 0xC7, 0x0E, 0x85, 0x7F,
0x7D, 0xE7, 0x99, 0x88, 0xED, 0x9F, 0xC2, 0x91, 0x29, 0x24, 0xB1, 0xBB, 0x9B, 0x18, 0xEC, 0x93,
0x22, 0x7E, 0xA9, 0x16, 0x35, 0x84, 0x87, 0xCA, 0x13, 0x5C, 0x30, 0x38, 0xAF, 0x1F, 0x40, 0xE7,
0xF0, 0xAF, 0x6D, 0x92, 0xCB, 0x9E, 0x7E, 0x64, 0x64, 0x43, 0xBA, 0x0C, 0x36, 0xD2, 0x87, 0x26,
0x30, 0x7C, 0x85, 0x90, 0x8F, 0x4C, 0x2A, 0xAA, 0x4D, 0x3E, 0x2A, 0x25, 0xCD, 0x57, 0x06, 0xEC,
0x62, 0x70, 0x5B, 0x4A, 0x96, 0x4B, 0x5A, 0x46, 0xAB, 0x3C, 0x35, 0xC1, 0x0B, 0x6B, 0x5B, 0xD9,
0x59, 0xC3, 0xA0, 0xF2, 0x5E, 0xF8, 0x0B, 0xF8, 0x29, 0x18, 0x53, 0x34, 0x84, 0x93, 0x09, 0x2C,
0x12, 0x3E, 0x85, 0x3C, 0x1A, 0x42, 0xCA, 0xDE, 0x1C, 0xB3, 0x0A, 0x34, 0x12, 0x4A, 0xDE, 0xC2,
0x1D, 0x51, 0x09, 0x49, 0x52, 0x6A, 0xD0, 0xC0, 0x72, 0x71, 0x09, 0x75, 0xB6, 0x24, 0x6C, 0x54,
0x23, 0x51, 0x8D, 0x99, 0x2E, 0x37, 0x21, 0xED, 0x87, 0xB0, 0xF7, 0x02, 0xB6, 0xB4, 0x5D, 0x86,
0x81, 0x64, 0x85, 0xB3, 0x25, 0x55, 0xFD, 0x02, 0xD3, 0x39, 0x0D, 0x70, 0xD8, 0x88, 0x6A, 0x12,
0x12, 0xEB, 0xE0, 0x00, 0x90, 0x1E, 0x43, 0x53, 0x5D, 0x86, 0x0D, 0x28, 0x27, 0x45, 0x0A, 0x43,
0xC1, 0x2D, 0x71, 0x35, 0x86, 0x4C, 0x31, 0x51, 0x81, 0x7B, 0xE9, 0xAF, 0x41, 0xC9, 0x42, 0x42,
0xAA, 0x25, 0x13, 0x48, 0x49, 0xB1, 0xE4, 0x92, 0xF7, 0xC3, 0x1A, 0x9D, 0x00, 0x96, 0x9D, 0xB2,
0x37, 0xB0, 0x47, 0xAF, 0x03, 0x46, 0x90, 0x9E, 0xF6, 0x4D, 0x79, 0x22, 0x3B, 0x1D, 0xBC, 0x78,
0xDD, 0xE9, 0x5A, 0x4A, 0x93, 0x68, 0x1E, 0x26, 0x30, 0x7A, 0x02, 0x62, 0x77, 0x7B, 0x0F, 0xC3,
0x17, 0x0B, 0xDB, 0x79, 0x56, 0x71, 0xD1, 0x1F, 0x3D, 0xCB, 0x72, 0x93, 0x37, 0xC6, 0x64, 0xB9,
0x47, 0x96, 0x0D, 0xE8, 0x01, 0xA0, 0x99, 0x04, 0x1C, 0xA0, 0xCC, 0x59, 0x96, 0x3A, 0xC7, 0x5A,
0x42, 0x96, 0x29, 0xC1, 0xB0, 0x05, 0x8A, 0xF5, 0x08, 0x2C, 0xDB, 0x19, 0x59, 0xB6, 0x9E, 0x65,
0xE8, 0x86, 0x9A, 0xC2, 0x94, 0xF4, 0x13, 0x05, 0x5C, 0xC7, 0x5A, 0x44, 0xBB, 0x4E, 0x76, 0x07,
0x19, 0x33, 0x2E, 0x53, 0xB4, 0x88, 0x27, 0x13, 0x72, 0x98, 0xF0, 0x00, 0xC9, 0x38, 0x0B, 0xB9,
0xF5, 0x98, 0x47, 0xDD, 0xC5, 0x00, 0x43, 0xE9, 0x35, 0x01, 0x06, 0x57, 0x2E, 0xBC, 0xA0, 0x91,
0x9A, 0x70, 0x39, 0x2D, 0xBD, 0xCD, 0x9C, 0x55, 0x76, 0x64, 0xA0, 0x4E, 0x28, 0x5B, 0x7B, 0x64,
0x1D, 0x9A, 0x87, 0x25, 0xC7, 0xD0, 0xB3, 0x8F, 0x39, 0x63, 0x30, 0xDF, 0x62, 0x24, 0xAD, 0xA0,
0xF0, 0x6A, 0x00, 0x99, 0xF6, 0x1E, 0xC0, 0xBA, 0x33, 0x04, 0xF0, 0x67, 0xD6, 0xA1, 0x5A, 0x09,
0x8C, 0xEB, 0x02, 0xF8, 0x4B, 0x29, 0xE9, 0x08, 0x81, 0x0F, 0x90, 0xEB, 0x92, 0x26, 0x73, 0x96,
0xB2, 0x0E, 0x40, 0x29, 0xE3, 0x65, 0x04, 0xA4, 0x09, 0x91, 0x16, 0x30, 0x1A, 0xA2, 0x72, 0x1F,
0xD4, 0x3E, 0x22, 0x2A, 0x2C, 0xC3, 0xA8, 0x0E, 0xAD, 0x33, 0x5B, 0xE0, 0xF4, 0xA5, 0x06, 0x17,
0x9D, 0x93, 0x6B, 0x6E, 0x72, 0x23, 0xEA, 0x7C, 0x3A, 0x08, 0x1A, 0x2F, 0xB9, 0x7E, 0x4C, 0xFA,
0xCE, 0x60, 0xDE, 0x54, 0x27, 0xCA, 0xA4, 0x15, 0x97, 0x41, 0xD5, 0xEB, 0xE0, 0xDC, 0xCE, 0xF3,
0xAB, 0x5B, 0x1C, 0x73, 0x17, 0xC5, 0x7D, 0x44, 0x7F, 0x0F, 0xAF, 0x70, 0x76, 0x72, 0xBC, 0xB0,
0x45, 0x6A, 0xFF, 0x36, 0xBD, 0xAF, 0xA6, 0xBF, 0xA5, 0x34, 0x8A, 0xAA, 0xA5, 0x74, 0x26, 0x1C,
0x32, 0x8B, 0x5A, 0xE8, 0x9D, 0xD2, 0x4E, 0xC8, 0x94, 0x79, 0x48, 0x9D, 0x93, 0x6A, 0x70, 0x88,
0x9B, 0xB9, 0x58, 0xB8, 0x2B, 0x2E, 0xF9, 0xF4, 0x46, 0xF0, 0x13, 0x87, 0xA2, 0x7D, 0x5E, 0x28,
0xE5, 0x2D, 0xF0, 0x0B, 0x2A, 0x04, 0xFE, 0x26, 0x20, 0x10, 0x1F, 0x7A, 0xCC, 0x7E, 0x82, 0x5F,
0x83, 0x5F, 0xE6, 0xA1, 0x93, 0x38, 0xAF, 0xC2, 0xD2, 0xCC, 0xBF, 0xB8, 0x0F, 0xE0, 0x6E, 0x9E,
0x59, 0xA5, 0x7D, 0x8D, 0x5F, 0x4D, 0xCF, 0xAC, 0xAA, 0xB3, 0xAB, 0x4A, 0xDC, 0x44, 0xF7, 0xFE,
0x18, 0xBB, 0x63, 0x3C, 0x80, 0x5D, 0x64, 0x13, 0x92, 0xDD, 0xE8, 0xBD, 0xD9, 0x3A, 0xD2, 0x61,
0xD5, 0x1F, 0xCF, 0x9D, 0x9B, 0x4F, 0x8F, 0x6F, 0xF5, 0xC7, 0x6F, 0xD0, 0xE7, 0xE4, 0x0A, 0x7A,
0xB9, 0x79, 0x3B, 0xD3, 0xF1, 0xC1, 0xEA, 0x45, 0xA3, 0x6C, 0x23, 0xE1, 0x52, 0x02, 0xDB, 0x06,
0xCB, 0xE7, 0xED, 0x86, 0x06, 0xB9, 0xFE, 0x08, 0xFE, 0x8B, 0xDB, 0xD0, 0x9A, 0x59, 0x7C, 0x94,
0x8F, 0x4C, 0x88, 0x61, 0xAE, 0xEF, 0x59, 0x13, 0x1D, 0xCB, 0xDD, 0xEC, 0xE8, 0x19, 0x4D, 0xA2,
0x90, 0x46, 0x48, 0x9C, 0xB0, 0x74, 0x9C, 0x9D, 0xB5, 0x5C, 0x39, 0x49, 0x3C, 0x60, 0xB6, 0x3C,
0xDE, 0x66, 0x17, 0xB7, 0x21, 0x0F, 0xD0, 0xDA, 0x68, 0x0B, 0xDD, 0x82, 0x26, 0x64, 0xF5, 0x82,
0x26, 0x1D, 0xB6, 0xE3, 0x6A, 0x0F, 0xE6, 0x86, 0xE0, 0xE1, 0x33, 0x42, 0x96, 0xAA, 0xBF, 0x60,
0xC9, 0x22, 0xD2, 0x16, 0xB8, 0x1D, 0xB5, 0x43, 0xB8, 0x39, 0xFC, 0x5E, 0xE8, 0xD1, 0xB6, 0xC8,
0x37, 0xB2, 0x55, 0xFC, 0xE7, 0x3F, 0xBC, 0xAC, 0x9B, 0xB0, 0xD3, 0x60, 0x69, 0x94, 0xD1, 0xF9,
0xA4, 0xDC, 0xBF, 0x95, 0x5C, 0xB3, 0xE5, 0x7C, 0x6D, 0x57, 0x55, 0x00, 0xF4, 0x22, 0xCF, 0x96,
0xDA, 0x06, 0x66, 0xDC, 0x6C, 0x69, 0x90, 0x18, 0x8D, 0x90, 0x7E, 0x8C, 0x09, 0x9B, 0xF0, 0x11,
0x97, 0x42, 0x7B, 0x00, 0x95, 0x5A, 0xE7, 0x5D, 0x0F, 0xE2, 0x72, 0x50, 0xE6, 0xFF, 0xF1, 0xB2,
0x3F, 0x9D, 0x4E, 0x7F, 0xC7, 0x78, 0x58, 0xF8, 0x54, 0xEF, 0x9E, 0x0F, 0xC4, 0xE7, 0xA5, 0xB4,
0xE8, 0x71, 0x35, 0xD8, 0xCE, 0x81, 0xD0, 0x25, 0x8A, 0xC8, 0x78, 0x13, 0x3A, 0xF8, 0x39, 0x88,
0xBA, 0xF8, 0x54, 0x2E, 0xCB, 0x2E, 0x39, 0xB8, 0x12, 0xEB, 0x44, 0x9F, 0x38, 0x82, 0x7F, 0x9F,
0x4E, 0xEF, 0x13, 0x8D, 0xAB, 0xD4, 0x95, 0xCD, 0xF0, 0xE9, 0xFE, 0xAB, 0xD7, 0xFF, 0x40, 0x7C,
0x96, 0x7E, 0xD7, 0x7F, 0xBD, 0xF8, 0x7D, 0xED, 0xA8, 0x07, 0xE7, 0x84, 0x4F, 0xA1, 0x48, 0xC2,
0xAD, 0xD9, 0x98, 0x20, 0x24, 0x18, 0xE9, 0xA7, 0x16, 0xB0, 0x40, 0xA7, 0x52, 0xC0, 0xDB, 0x29,
0x21, 0xBA, 0x49, 0x20, 0x30, 0x6A, 0x15, 0x8B, 0x58, 0xC8, 0x82, 0x18, 0x33, 0xB5, 0x27, 0x57,
0x41, 0x2E, 0xA3, 0xB9, 0x66, 0x44, 0x4B, 0xEB, 0x58, 0x60, 0x8C, 0xFE, 0x48, 0x2C, 0x10, 0x5B,
0x2D, 0x33, 0x5A, 0xC5, 0x7A, 0x40, 0x3C, 0xB5, 0x30, 0x6F, 0x54, 0x82, 0x88, 0x2B, 0x1B, 0x0D,
0x1B, 0x21, 0x94, 0xD6, 0x7C, 0x6B, 0xE8, 0x78, 0xC6, 0x2E, 0x34, 0x00, 0xAC, 0x80, 0x58, 0x8A,
0x8E, 0x58, 0xAD, 0x69, 0xAD, 0x84, 0xB6, 0xCC, 0x8A, 0xC1, 0x3B, 0x17, 0x6F, 0x32, 0x35, 0xD6,
0x82, 0x4A, 0x90, 0x4F, 0x8A, 0xB8, 0x81, 0x33, 0x26, 0x10, 0x35, 0x7E, 0x5C, 0x89, 0xFA, 0x17,
0x63, 0x86, 0x81, 0xF4, 0x00, 0xEA, 0x7C, 0x01, 0x6A, 0xFF, 0x7E, 0xF3, 0x85, 0x9F, 0xB1, 0x0C,
0xBD, 0x0D, 0xFA, 0xE9, 0x7F, 0x7F, 0xD7, 0x2F, 0xBC, 0x84, 0x3D, 0x76, 0xA0, 0x4E, 0x0A, 0x34,
0x24, 0x07, 0x2B, 0xE4, 0x5A, 0xE4, 0xE0, 0x4A, 0x90, 0xDE, 0x44, 0x6D, 0xBB, 0x4A, 0x0C, 0xC3,
0xB2, 0x50, 0x24, 0xB0, 0xC2, 0x5B, 0x0E, 0x68, 0x59, 0x9F, 0x96, 0x89, 0x17, 0xFD, 0x3F, 0x4E,
0xB7, 0x24, 0xA2, 0x6D, 0xAF, 0x97, 0xB2, 0xC0, 0xEA, 0xA2, 0xF0, 0x45, 0x2E, 0xEC, 0x7C, 0x17,
0x94, 0xC8, 0xB7, 0x3F, 0x74, 0xDB, 0x4E, 0x86, 0x94, 0xD6, 0xB1, 0xB7, 0xFB, 0x67, 0xC3, 0x5A,
0x8E, 0xE2, 0xA1, 0x1A, 0x4E, 0x9F, 0xB3, 0xCB, 0x7B, 0x5C, 0xBA, 0x1C, 0xF5, 0xAD, 0x8F, 0x2B,
0x39, 0xD6, 0x0B, 0xC0, 0xD6, 0x23, 0xB9, 0xFE, 0xBC, 0x3B, 0xBD, 0xB9, 0x83, 0x6C, 0x64, 0x70,
0x28, 0xAA, 0x71, 0x28, 0x3B, 0xC4, 0x21, 0x0B, 0x9C, 0xA9, 0xE6, 0x8D, 0x44, 0x6C, 0x20, 0xA2,
0x36, 0xBC, 0xF8, 0xA8, 0x19, 0x6A, 0x39, 0x75, 0x56, 0x07, 0x76, 0x75, 0xD5, 0x34, 0xB1, 0x6D,
0x7E, 0x24, 0x49, 0x7D, 0x7A, 0xC5, 0xEF, 0xB4, 0x6E, 0x27, 0xAD, 0xCF, 0xD1, 0x63, 0xE4, 0xE9,
0x73, 0xBD, 0xC3, 0xD0, 0xD9, 0xB1, 0x4A, 0x18, 0x34, 0x27, 0x57, 0x6D, 0x75, 0x25, 0xB3, 0xBF,
0xFA, 0xBC, 0xB4, 0xDD, 0x07, 0x6A, 0x5F, 0x7E, 0x28, 0x17, 0x92, 0xA5, 0xFA, 0xCC, 0xBE, 0xBC,
0x3B, 0xD6, 0xF6, 0x30, 0x5F, 0x77, 0xD4, 0x7E, 0x70, 0x43, 0xD6, 0xFE, 0xC4, 0x62, 0x82, 0x3E,
0xE6, 0x37, 0xE7, 0xC8, 0x5F, 0xB6, 0x76, 0xD7, 0xB1, 0xF8, 0xA5, 0x5C, 0xAE, 0xFA, 0x25, 0xB4,
0x76, 0xEF, 0xB1, 0xFB, 0x1C, 0x7A, 0xE8, 0xA8, 0x60, 0x1F, 0x14, 0x54, 0x32, 0x14, 0xA2, 0xDF,
0x8B, 0xFC, 0xF8, 0x4D, 0x44, 0x3B, 0xBB, 0xC8, 0x56, 0xC7, 0x0C, 0x15, 0x1F, 0xCF, 0x6D, 0xA4,
0x96, 0x52, 0x26, 0x35, 0x3B, 0x5F, 0xFC, 0x65, 0x15, 0x6B, 0x85, 0xC4, 0x67, 0x7E, 0xBA, 0xED,
0xF3, 0xD7, 0xA5, 0x53, 0x2B, 0x1C, 0xF6, 0xD7, 0x15, 0xA4, 0xC4, 0x05, 0x59, 0x54, 0x3D, 0x8C,
0xF8, 0x23, 0x84, 0xD1, 0x2A, 0xDA, 0xE2, 0xE4, 0xCF, 0x65, 0xC0, 0xE2, 0xAC, 0x11, 0x0F, 0xED,
0x69, 0x23, 0x79, 0x87, 0xEA, 0xA4, 0x06, 0x77, 0xC1, 0x2B, 0x3D, 0x0E, 0x6C, 0x1E, 0xB7, 0x20,
0x18, 0xAC, 0x44, 0x37, 0x0C, 0x66, 0xB8, 0xC0, 0xE6, 0x92, 0x70, 0x4D, 0x22, 0x44, 0x4A, 0x43,
0xDA, 0x14, 0x6B, 0x51, 0xE2, 0x0C, 0xF3, 0x4E, 0x8F, 0x83, 0xA1, 0x49, 0x69, 0xD8, 0x99, 0x46,
0x68, 0xF9, 0x6B, 0x14, 0xBC, 0x1C, 0xD7, 0x70, 0x2F, 0xE2, 0xB9, 0x46, 0x41, 0xBA, 0xA8, 0x61,
0x73, 0x37, 0xA9, 0x94, 0x25, 0xC5, 0x09, 0x77, 0x92, 0x06, 0xAC, 0x7B, 0xC2, 0x10, 0x75, 0xC7,
0x55, 0xF3, 0x9E, 0x16, 0x12, 0xC7, 0xAE, 0x1A, 0x9A, 0xA7, 0xF5, 0xCE, 0x67, 0xE8, 0xBE, 0x9F,
0xAC, 0x7C, 0x4F, 0x97, 0x9D, 0xEB, 0x04, 0x53, 0xDF, 0x3C, 0xE9, 0x7A, 0x7B, 0xFB, 0x63, 0xCB,
0x66, 0xB3, 0x46, 0x64, 0x1F, 0xF3, 0xD0, 0x3B, 0xFE, 0x43, 0xCC, 0x15, 0xCB, 0x74, 0x98, 0xA1,
0x95, 0xAA, 0x98, 0xCB, 0xAF, 0xAD, 0x72, 0xF4, 0x80, 0x45, 0xC8, 0xFC, 0x99, 0xF6, 0x5D, 0x60,
0x2A, 0x6E, 0x96, 0x90, 0x65, 0x8B, 0x1C, 0x80, 0xE2, 0x8F, 0x08, 0x23, 0x4B, 0x94, 0xD2, 0x05,
0x5B, 0x01, 0xFB, 0x60, 0x7B, 0x1B, 0x49, 0xC3, 0x2E, 0xD9, 0x2C, 0x37, 0x7D, 0xD4, 0xEE, 0x49,
0xDF, 0x26, 0xBC, 0x16, 0xC3, 0x2C, 0xF8, 0x2E, 0x31, 0xBA, 0x5D, 0xCD, 0xE6, 0x69, 0x95, 0x3B,
0x09, 0x71, 0xF6, 0x16, 0x9B, 0x12, 0xE4, 0xFB, 0xB0, 0xE2, 0x87, 0x16, 0x23, 0x72, 0xCC, 0xEF,
0x9A, 0x1A, 0xFC, 0x75, 0x0E, 0xFE, 0xE8, 0xEA, 0x0B, 0x58, 0x66, 0xEE, 0x67, 0xD9, 0x27, 0x1F,
0x7F, 0xF5, 0x93, 0x8E, 0x8D, 0x63, 0x41, 0x33, 0xF5, 0x55, 0x5B, 0x53, 0xFB, 0x91, 0xAF, 0xE1,
0xF1, 0x49, 0xDB, 0x88, 0xEF, 0x06, 0x5B, 0x11, 0xA0, 0xD7, 0x96, 0x43, 0x82, 0x56, 0x3E, 0xD0,
0xCF, 0xD8, 0xCF, 0xF8, 0x25, 0x57, 0x2B, 0x5D, 0x1A, 0xCF, 0xAA, 0x01, 0xD9, 0xF9, 0x3A, 0x95,
0x94, 0xAF, 0x63, 0x7B, 0xC9, 0xBD, 0xC6, 0x77, 0x82, 0xBB, 0xD1, 0x00, 0x75, 0x57, 0x07, 0xE2,
0x53, 0x7A, 0xC5, 0x6B, 0x7C, 0x9C, 0xEB, 0xE6, 0x43, 0x0D, 0x56, 0x0B, 0x77, 0x11, 0xCA, 0xBC,
0xFC, 0x7A, 0x62, 0x3A, 0xF9, 0x92, 0x10, 0xF9, 0xE9, 0xAE, 0xE3, 0x02, 0x63, 0xAD, 0xAE, 0xAF,
0x57, 0x30, 0x8E, 0xD1, 0x85, 0xCE, 0xB5, 0xBC, 0xAF, 0x6A, 0xF4, 0x51, 0x66, 0x04, 0xAB, 0x45,
0x3F, 0x2F, 0xF0, 0x3A, 0x7A, 0x88, 0xD7, 0xE0, 0x88, 0xDD, 0xD5, 0xBB, 0xEE, 0xE3, 0xF6, 0x09,
0x87, 0xA5, 0xA1, 0xC9, 0xFF, 0xC2, 0xD5, 0xF7, 0xEE, 0xE0, 0x35, 0x3C, 0x64, 0x17, 0x76, 0xE7,
0x0A, 0x5E, 0x35, 0xFB, 0x95, 0xB0, 0x0A, 0x6B, 0x8D, 0x94, 0x16, 0x1F, 0x7F, 0xC5, 0xB0, 0xB3,
0xAB, 0xA1, 0x82, 0x81, 0x71, 0xEE, 0x18, 0x57, 0x6C, 0x06, 0x60, 0x1A, 0x96, 0x53, 0x67, 0xE9,
0x31, 0xE2, 0x46, 0x14, 0x3F, 0x9A, 0x44, 0x47, 0xB4, 0xF5, 0xED, 0x87, 0x54, 0xEF, 0x88, 0x77,
0x46, 0xF6, 0xE4, 0x4B, 0xA5, 0x73, 0x0D, 0xC6, 0xA7, 0x6E, 0xF5, 0x36, 0x35, 0xBE, 0x46, 0xF3,
0x9A, 0xF7, 0x31, 0x5C, 0x21, 0x00, 0xA3, 0xB2, 0xEF, 0x49, 0x75, 0x4D, 0xA7, 0x24, 0xCE, 0xCC,
0x6B, 0xF7, 0x3D, 0x63, 0x58, 0x26, 0xEF, 0xB7, 0x5C, 0xFF, 0x8A, 0x72, 0xA5, 0xBA, 0x78, 0x2E,
0xEA, 0xD5, 0xBD, 0xC7, 0x95, 0x32, 0xCF, 0xAA, 0x1D, 0x65, 0xDE, 0x7D, 0x18, 0x1D, 0x98, 0x70,
0x26, 0x3B, 0x06, 0x39, 0x1C, 0xF6, 0xCC, 0x4A, 0x9E, 0x36, 0xEA, 0x55, 0x19, 0x7E, 0xA9, 0x9A,
0xB1, 0x7C, 0x9E, 0x37, 0x51, 0x79, 0xDB, 0xE0, 0xCB, 0x70, 0xB4, 0x81, 0xAF, 0xE4, 0x7F, 0xB0,
0xB5, 0x98, 0xF4, 0xAD, 0x32, 0x5E, 0x27, 0x9E, 0xE7, 0xE5, 0xDD, 0x6F, 0xE2, 0x99, 0x93, 0x67,
0x4E, 0x9E, 0x48, 0xFA, 0xE0, 0x29, 0xE4, 0x89, 0x01, 0x3C, 0x15, 0x79, 0xF2, 0x1B, 0x93, 0xC6,
0x44, 0xE5, 0xC2, 0x27, 0xFF, 0x97, 0x54, 0x0A, 0x3C, 0x61, 0x0F, 0xF0, 0x14, 0xF2, 0x94, 0x2B,
0xE4, 0x99, 0xF4, 0x2D, 0x37, 0x5E, 0x17, 0xE7, 0x79, 0xFA, 0xB8, 0x48, 0x87, 0x96, 0xCE, 0xA1,
0xF7, 0x3B, 0x2D, 0xAC, 0x4D, 0x17, 0xD3, 0xA9, 0xEF, 0x05, 0xCB, 0x4D, 0x36, 0xD1, 0x49, 0x0E,
0xA7, 0x26, 0xD7, 0x29, 0x27, 0x8B, 0x62, 0x56, 0x86, 0xDD, 0x9C, 0xB0, 0x9C, 0xFF, 0x07, 0x35,
0x8E, 0x31, 0x0E, 0xC2, 0x30, 0x0C, 0x45, 0x3F, 0x89, 0x04, 0x43, 0x86, 0x70, 0x83, 0x1E, 0x21,
0x0B, 0x03, 0x0B, 0xA2, 0x12, 0xC7, 0x64, 0xE0, 0x22, 0x48, 0x0D, 0x9C, 0xA0, 0xDC, 0x24, 0x43,
0xC5, 0x94, 0xF4, 0xF7, 0x9B, 0x08, 0x4B, 0xF6, 0x93, 0xFC, 0x6C, 0xD9, 0xC0, 0x3F, 0x4E, 0x1D,
0xED, 0x57, 0x3D, 0x47, 0x43, 0xE4, 0x6C, 0x38, 0xEF, 0x17, 0x43, 0xC1, 0xC5, 0x54, 0x41, 0x94,
0x8C, 0xDF, 0x76, 0x90, 0xBC, 0x92, 0x37, 0x49, 0x92, 0xEF, 0xA6, 0x2D, 0xF2, 0xC3, 0x31, 0x0A,
0x2F, 0xCE, 0x52, 0xCD, 0x71, 0x99, 0xB8, 0x8E, 0x9E, 0x35, 0xB1, 0x62, 0x60, 0x09, 0xAC, 0x3B,
0x32, 0x3B, 0x56, 0x4D, 0x01, 0x53, 0x1B, 0xD4, 0x47, 0x5A, 0xA5, 0x80, 0xA0, 0xC5, 0x0C, 0x38,
0xDE, 0x69, 0xF7, 0x26, 0x5F, 0x0D, 0x49, 0x17, 0x15, 0xE1, 0x91, 0x0D, 0x8E, 0xFD, 0xCF, 0x67,
0xC7, 0x51, 0xB9, 0x01,
};
static const EpdGlyph bookerly_14_regularGlyphs[] = {
{ 0, 0, 0, 0, 0, 0, 0 }, //
{ 0, 0, 0, 0, 0, 0, 0 }, // 
{ 0, 0, 6, 0, 0, 0, 0 }, //
{ 0, 0, 6, 0, 0, 0, 0 }, //
{ 0, 0, 0, 0, 0, 0, 0 }, // 
{ 0, 0, 6, 0, 0, 0, 0 }, //
fix: force auto-hinting for Bookerly to fix inconsistent stem widths (#1098) ## Summary Bookerly's native TrueType hinting is effectively a no-op at the sizes used here, causing FreeType to place stems at inconsistent sub-pixel positions. This results in the 'k' stem (8-bit fringe: 0x38=56) falling just below the 2-bit quantization threshold while 'l' and 'h' stems (fringes: 0x4C=76, 0x40=64) land above it --- making 'k' visibly narrower (2.00px vs 2.33px effective width). FreeType's auto-hinter snaps all stems to consistent grid positions, normalizing effective stem width to 2.67px across all glyphs. Adds --force-autohint flag to fontconvert.py and applies it to Bookerly only. NotoSans, OpenDyslexic, and Ubuntu fonts are unaffected. Here is an example of before/after. Take notice of the vertical stems on characters like `l`, `k`, `n`, `i`, etc. The font is Bookerly 12pt regular: **BEFORE**: ![before](https://github.com/user-attachments/assets/65b2acab-ad95-489e-885e-e3a0163cc252) **AFTER**: ![after](https://github.com/user-attachments/assets/d09a8b5d-40af-4a7d-b622-e1b2cabcce85) Claude generated this script to quantitatively determine that this change makes the vertical stems on a variety of characters more consistent for Bookerly _only_. <details> <summary>Python script</summary> ```python #!/usr/bin/env python3 """Compare stem consistency across all font families with and without auto-hinting. Run from repo root: python3 compare_all_fonts.py """ import freetype DPI = 150 CHARS = ["k", "l", "h", "i", "b", "d"] SIZES = [12, 14, 16, 18] FONTS = { "Bookerly": "lib/EpdFont/builtinFonts/source/Bookerly/Bookerly-Regular.ttf", "NotoSans": "lib/EpdFont/builtinFonts/source/NotoSans/NotoSans-Regular.ttf", "OpenDyslexic": "lib/EpdFont/builtinFonts/source/OpenDyslexic/OpenDyslexic-Regular.otf", "Ubuntu": "lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Regular.ttf", } MODES = { "default": freetype.FT_LOAD_RENDER, "autohint": freetype.FT_LOAD_RENDER | freetype.FT_LOAD_FORCE_AUTOHINT, } def q4to2(v): if v >= 12: return 3 elif v >= 8: return 2 elif v >= 4: return 1 else: return 0 def get_stem_eff(face, char, flags): gi = face.get_char_index(ord(char)) if gi == 0: return None face.load_glyph(gi, flags) bm = face.glyph.bitmap w, h = bm.width, bm.rows if w == 0 or h == 0: return None p2 = [] for y in range(h): row = [] for x in range(w): row.append(q4to2(bm.buffer[y * bm.pitch + x] >> 4)) p2.append(row) # Measure leftmost stem in stable middle rows mid_start, mid_end = h // 4, h - h // 4 widths = [] for y in range(mid_start, mid_end): first = next((x for x in range(w) if p2[y][x] > 0), -1) if first < 0: continue last = first for x in range(first, w): if p2[y][x] > 0: last = x else: break eff = sum(p2[y][x] for x in range(first, last + 1)) / 3.0 widths.append(eff) return round(sum(widths) / len(widths), 2) if widths else None def main(): for font_name, font_path in FONTS.items(): try: freetype.Face(font_path) except Exception: print(f"\n {font_name}: SKIPPED (file not found)") continue print(f"\n{'=' * 80}") print(f" {font_name}") print(f"{'=' * 80}") for size in SIZES: print(f"\n {size}pt:") print(f" {'':6s}", end="") for c in CHARS: print(f" '{c}' ", end="") print(" | spread") for mode_name, flags in MODES.items(): face = freetype.Face(font_path) face.set_char_size(size << 6, size << 6, DPI, DPI) vals = [] print(f" {mode_name:6s}", end="") for c in CHARS: v = get_stem_eff(face, c, flags) vals.append(v) print(f" {v:5.2f}" if v else " N/A", end="") valid = [v for v in vals if v is not None] spread = max(valid) - min(valid) if len(valid) >= 2 else 0 marker = " <-- inconsistent" if spread > 0.5 else "" print(f" | {spread:.2f}{marker}") if __name__ == "__main__": main() ``` </details> Here are the results. The table compares how the font-generation `autohint` flag affects the range of widths of various characters. Lower `spread` mean that glyph stroke widths should appear more consistent. ``` Spread = max stem width - min stem width across glyphs (lower = more consistent): ┌──────────────┬──────┬─────────┬──────────┬──────────┐ │ Font │ Size │ Default │ Autohint │ Winner │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Bookerly │ 12pt │ 1.49 │ 1.12 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.39 │ 1.13 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.38 │ 1.16 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.90 │ 1.58 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ NotoSans │ 12pt │ 1.16 │ 0.94 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 0.83 │ 1.14 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.41 │ 1.51 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.74 │ 1.63 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ OpenDyslexic │ 12pt │ 2.22 │ 1.44 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 2.57 │ 3.29 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 3.13 │ 2.60 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 3.21 │ 3.23 │ ~tied │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Ubuntu │ 12pt │ 1.25 │ 1.31 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.41 │ 1.64 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 2.21 │ 1.71 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.80 │ 1.71 │ autohint │ └──────────────┴──────┴─────────┴──────────┴──────────┘ ``` --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? I used AI to make sure I'm not doing something stupid, since I'm not a typography expert. I made the changes though.
2026-02-24 06:13:08 +11:00
{ 4, 23, 9, 3, 23, 23, 0 }, // !
{ 9, 10, 12, 2, 21, 23, 23 }, // "
{ 18, 19, 18, 0, 18, 86, 46 }, // #
{ 14, 31, 19, 3, 25, 109, 132 }, // $
{ 26, 23, 29, 2, 22, 150, 241 }, // %
{ 22, 23, 24, 2, 23, 127, 391 }, // &
{ 4, 10, 7, 2, 21, 10, 518 }, // '
{ 9, 31, 11, 1, 25, 70, 528 }, // (
{ 10, 31, 11, 1, 25, 78, 598 }, // )
{ 10, 10, 11, 0, 22, 25, 676 }, // *
{ 12, 13, 18, 3, 17, 39, 701 }, // +
{ 6, 9, 8, 0, 3, 14, 740 }, // ,
{ 9, 3, 11, 1, 9, 7, 754 }, // -
{ 4, 4, 8, 2, 4, 4, 761 }, // .
{ 13, 23, 14, 1, 22, 75, 765 }, // /
{ 16, 21, 18, 1, 21, 84, 840 }, // 0
{ 12, 21, 18, 3, 21, 63, 924 }, // 1
{ 14, 21, 18, 2, 21, 74, 987 }, // 2
{ 14, 21, 18, 2, 21, 74, 1061 }, // 3
{ 16, 22, 18, 0, 22, 88, 1135 }, // 4
{ 14, 21, 18, 2, 21, 74, 1223 }, // 5
{ 15, 21, 18, 2, 21, 79, 1297 }, // 6
{ 14, 21, 18, 3, 21, 74, 1376 }, // 7
{ 14, 21, 18, 2, 21, 74, 1450 }, // 8
{ 14, 21, 18, 2, 21, 74, 1524 }, // 9
{ 4, 15, 8, 2, 15, 15, 1598 }, // :
{ 6, 21, 8, 0, 15, 32, 1613 }, // ;
{ 13, 14, 18, 3, 17, 46, 1645 }, // <
{ 12, 8, 18, 3, 15, 24, 1691 }, // =
{ 13, 14, 18, 2, 17, 46, 1715 }, // >
{ 11, 22, 14, 2, 22, 61, 1761 }, // ?
{ 25, 27, 27, 1, 21, 169, 1822 }, // @
{ 22, 21, 23, 0, 21, 116, 1991 }, // A
{ 17, 21, 18, 1, 21, 90, 2107 }, // B
{ 16, 21, 18, 1, 21, 84, 2197 }, // C
{ 20, 21, 21, 1, 21, 105, 2281 }, // D
{ 17, 21, 19, 1, 21, 90, 2386 }, // E
{ 15, 21, 16, 1, 21, 79, 2476 }, // F
{ 19, 21, 21, 1, 21, 100, 2555 }, // G
{ 23, 21, 25, 1, 21, 121, 2655 }, // H
{ 9, 21, 11, 1, 21, 48, 2776 }, // I
{ 12, 27, 11, -2, 21, 81, 2824 }, // J
{ 21, 21, 22, 1, 21, 111, 2905 }, // K
{ 17, 21, 18, 1, 21, 90, 3016 }, // L
{ 26, 21, 27, 0, 21, 137, 3106 }, // M
{ 23, 22, 24, 1, 21, 127, 3243 }, // N
{ 20, 21, 22, 1, 21, 105, 3370 }, // O
{ 16, 21, 18, 1, 21, 84, 3475 }, // P
{ 22, 27, 22, 1, 21, 149, 3559 }, // Q
{ 20, 21, 20, 1, 21, 105, 3708 }, // R
{ 14, 21, 16, 1, 21, 74, 3813 }, // S
{ 18, 21, 20, 1, 21, 95, 3887 }, // T
{ 22, 21, 22, 0, 21, 116, 3982 }, // U
{ 21, 21, 21, 0, 21, 111, 4098 }, // V
{ 32, 21, 32, 1, 21, 168, 4209 }, // W
{ 21, 21, 22, 0, 21, 111, 4377 }, // X
{ 21, 21, 20, 0, 21, 111, 4488 }, // Y
{ 16, 22, 17, 1, 21, 88, 4599 }, // Z
{ 6, 30, 9, 2, 23, 45, 4687 }, // [
{ 13, 23, 14, 1, 22, 75, 4732 }, // <backslash>
{ 7, 30, 9, 1, 23, 53, 4807 }, // ]
{ 14, 14, 18, 2, 20, 49, 4860 }, // ^
{ 15, 3, 15, 0, -1, 12, 4909 }, // _
{ 6, 8, 20, 7, 25, 12, 4921 }, // `
{ 16, 16, 16, 1, 16, 64, 4933 }, // a
{ 17, 23, 18, 0, 23, 98, 4997 }, // b
{ 13, 16, 15, 1, 16, 52, 5095 }, // c
{ 17, 23, 19, 1, 23, 98, 5147 }, // d
{ 13, 16, 15, 1, 16, 52, 5245 }, // e
{ 15, 23, 13, 0, 23, 87, 5297 }, // f
{ 16, 23, 18, 1, 16, 92, 5384 }, // g
{ 19, 23, 19, 0, 23, 110, 5476 }, // h
{ 9, 23, 10, 1, 23, 52, 5586 }, // i
{ 8, 30, 8, -2, 23, 60, 5638 }, // j
{ 18, 23, 17, 0, 23, 104, 5698 }, // k
{ 9, 23, 9, 0, 23, 52, 5802 }, // l
{ 28, 16, 30, 1, 16, 112, 5854 }, // m
{ 19, 16, 20, 1, 16, 76, 5966 }, // n
{ 15, 16, 17, 1, 16, 60, 6042 }, // o
{ 17, 23, 19, 1, 16, 98, 6102 }, // p
{ 16, 23, 18, 1, 16, 92, 6200 }, // q
{ 13, 16, 14, 1, 16, 52, 6292 }, // r
{ 11, 16, 14, 2, 16, 44, 6344 }, // s
{ 12, 20, 12, 0, 20, 60, 6388 }, // t
{ 20, 16, 19, 0, 16, 80, 6448 }, // u
{ 18, 15, 18, 0, 15, 68, 6528 }, // v
{ 26, 15, 26, 0, 15, 98, 6596 }, // w
{ 18, 15, 17, -1, 15, 68, 6694 }, // x
{ 18, 22, 18, 0, 15, 99, 6762 }, // y
{ 14, 15, 14, 0, 15, 53, 6861 }, // z
{ 9, 30, 12, 2, 25, 68, 6914 }, // {
{ 3, 27, 8, 3, 23, 21, 6982 }, // |
{ 8, 30, 11, 1, 25, 60, 7003 }, // }
{ 13, 5, 19, 3, 13, 17, 7063 }, // ~
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
{ 0, 0, 6, 0, 0, 0, 0 }, //  
fix: force auto-hinting for Bookerly to fix inconsistent stem widths (#1098) ## Summary Bookerly's native TrueType hinting is effectively a no-op at the sizes used here, causing FreeType to place stems at inconsistent sub-pixel positions. This results in the 'k' stem (8-bit fringe: 0x38=56) falling just below the 2-bit quantization threshold while 'l' and 'h' stems (fringes: 0x4C=76, 0x40=64) land above it --- making 'k' visibly narrower (2.00px vs 2.33px effective width). FreeType's auto-hinter snaps all stems to consistent grid positions, normalizing effective stem width to 2.67px across all glyphs. Adds --force-autohint flag to fontconvert.py and applies it to Bookerly only. NotoSans, OpenDyslexic, and Ubuntu fonts are unaffected. Here is an example of before/after. Take notice of the vertical stems on characters like `l`, `k`, `n`, `i`, etc. The font is Bookerly 12pt regular: **BEFORE**: ![before](https://github.com/user-attachments/assets/65b2acab-ad95-489e-885e-e3a0163cc252) **AFTER**: ![after](https://github.com/user-attachments/assets/d09a8b5d-40af-4a7d-b622-e1b2cabcce85) Claude generated this script to quantitatively determine that this change makes the vertical stems on a variety of characters more consistent for Bookerly _only_. <details> <summary>Python script</summary> ```python #!/usr/bin/env python3 """Compare stem consistency across all font families with and without auto-hinting. Run from repo root: python3 compare_all_fonts.py """ import freetype DPI = 150 CHARS = ["k", "l", "h", "i", "b", "d"] SIZES = [12, 14, 16, 18] FONTS = { "Bookerly": "lib/EpdFont/builtinFonts/source/Bookerly/Bookerly-Regular.ttf", "NotoSans": "lib/EpdFont/builtinFonts/source/NotoSans/NotoSans-Regular.ttf", "OpenDyslexic": "lib/EpdFont/builtinFonts/source/OpenDyslexic/OpenDyslexic-Regular.otf", "Ubuntu": "lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Regular.ttf", } MODES = { "default": freetype.FT_LOAD_RENDER, "autohint": freetype.FT_LOAD_RENDER | freetype.FT_LOAD_FORCE_AUTOHINT, } def q4to2(v): if v >= 12: return 3 elif v >= 8: return 2 elif v >= 4: return 1 else: return 0 def get_stem_eff(face, char, flags): gi = face.get_char_index(ord(char)) if gi == 0: return None face.load_glyph(gi, flags) bm = face.glyph.bitmap w, h = bm.width, bm.rows if w == 0 or h == 0: return None p2 = [] for y in range(h): row = [] for x in range(w): row.append(q4to2(bm.buffer[y * bm.pitch + x] >> 4)) p2.append(row) # Measure leftmost stem in stable middle rows mid_start, mid_end = h // 4, h - h // 4 widths = [] for y in range(mid_start, mid_end): first = next((x for x in range(w) if p2[y][x] > 0), -1) if first < 0: continue last = first for x in range(first, w): if p2[y][x] > 0: last = x else: break eff = sum(p2[y][x] for x in range(first, last + 1)) / 3.0 widths.append(eff) return round(sum(widths) / len(widths), 2) if widths else None def main(): for font_name, font_path in FONTS.items(): try: freetype.Face(font_path) except Exception: print(f"\n {font_name}: SKIPPED (file not found)") continue print(f"\n{'=' * 80}") print(f" {font_name}") print(f"{'=' * 80}") for size in SIZES: print(f"\n {size}pt:") print(f" {'':6s}", end="") for c in CHARS: print(f" '{c}' ", end="") print(" | spread") for mode_name, flags in MODES.items(): face = freetype.Face(font_path) face.set_char_size(size << 6, size << 6, DPI, DPI) vals = [] print(f" {mode_name:6s}", end="") for c in CHARS: v = get_stem_eff(face, c, flags) vals.append(v) print(f" {v:5.2f}" if v else " N/A", end="") valid = [v for v in vals if v is not None] spread = max(valid) - min(valid) if len(valid) >= 2 else 0 marker = " <-- inconsistent" if spread > 0.5 else "" print(f" | {spread:.2f}{marker}") if __name__ == "__main__": main() ``` </details> Here are the results. The table compares how the font-generation `autohint` flag affects the range of widths of various characters. Lower `spread` mean that glyph stroke widths should appear more consistent. ``` Spread = max stem width - min stem width across glyphs (lower = more consistent): ┌──────────────┬──────┬─────────┬──────────┬──────────┐ │ Font │ Size │ Default │ Autohint │ Winner │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Bookerly │ 12pt │ 1.49 │ 1.12 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.39 │ 1.13 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.38 │ 1.16 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.90 │ 1.58 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ NotoSans │ 12pt │ 1.16 │ 0.94 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 0.83 │ 1.14 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.41 │ 1.51 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.74 │ 1.63 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ OpenDyslexic │ 12pt │ 2.22 │ 1.44 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 2.57 │ 3.29 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 3.13 │ 2.60 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 3.21 │ 3.23 │ ~tied │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Ubuntu │ 12pt │ 1.25 │ 1.31 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.41 │ 1.64 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 2.21 │ 1.71 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.80 │ 1.71 │ autohint │ └──────────────┴──────┴─────────┴──────────┴──────────┘ ``` --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? I used AI to make sure I'm not doing something stupid, since I'm not a typography expert. I made the changes though.
2026-02-24 06:13:08 +11:00
{ 4, 23, 9, 2, 16, 23, 0 }, // ¡
{ 13, 30, 18, 2, 24, 98, 23 }, // ¢
{ 16, 21, 17, 1, 21, 84, 121 }, // £
{ 17, 15, 18, 0, 17, 64, 205 }, // ¤
{ 20, 21, 19, -1, 21, 105, 269 }, // ¥
{ 3, 27, 8, 3, 23, 21, 374 }, // ¦
{ 12, 24, 14, 1, 21, 72, 395 }, // §
{ 10, 4, 20, 5, 23, 10, 467 }, // ¨
{ 21, 22, 23, 1, 21, 116, 477 }, // ©
{ 10, 14, 13, 2, 21, 35, 593 }, // ª
{ 15, 11, 16, 1, 13, 42, 628 }, // «
{ 13, 8, 18, 3, 15, 26, 670 }, // ¬
{ 9, 3, 11, 1, 9, 7, 696 }, // ­
{ 15, 17, 17, 1, 24, 64, 703 }, // ®
{ 10, 3, 20, 5, 22, 8, 767 }, // ¯
{ 10, 10, 15, 3, 21, 25, 775 }, // °
{ 12, 18, 18, 3, 18, 54, 800 }, // ±
{ 11, 13, 13, 1, 24, 36, 854 }, // ²
{ 9, 13, 13, 2, 24, 30, 890 }, // ³
{ 6, 8, 20, 7, 25, 12, 920 }, // ´
{ 17, 24, 19, 2, 17, 102, 932 }, // µ
{ 15, 26, 16, 0, 21, 98, 1034 }, // ¶
{ 4, 4, 8, 2, 10, 4, 1132 }, // ·
{ 7, 8, 20, 7, 0, 14, 1136 }, // ¸
{ 9, 14, 13, 2, 25, 32, 1150 }, // ¹
{ 10, 14, 14, 2, 21, 35, 1182 }, // º
{ 15, 11, 15, 1, 13, 42, 1217 }, // »
{ 29, 25, 32, 2, 23, 182, 1259 }, // ¼
{ 29, 25, 32, 2, 23, 182, 1441 }, // ½
{ 29, 25, 32, 2, 23, 182, 1623 }, // ¾
{ 10, 23, 14, 2, 16, 58, 1805 }, // ¿
{ 22, 29, 22, -1, 29, 160, 1863 }, // À
{ 22, 29, 23, 0, 29, 160, 2023 }, // Á
{ 22, 29, 23, 0, 29, 160, 2183 }, // Â
{ 22, 29, 22, 0, 29, 160, 2343 }, // Ã
{ 22, 28, 22, -1, 28, 154, 2503 }, // Ä
{ 22, 30, 22, 0, 30, 165, 2657 }, // Å
{ 27, 21, 27, -1, 21, 142, 2822 }, // Æ
{ 16, 29, 18, 1, 21, 116, 2964 }, // Ç
{ 17, 29, 19, 1, 29, 124, 3080 }, // È
{ 17, 29, 19, 1, 29, 124, 3204 }, // É
{ 17, 29, 19, 1, 29, 124, 3328 }, // Ê
{ 17, 28, 19, 1, 28, 119, 3452 }, // Ë
{ 9, 29, 11, 1, 29, 66, 3571 }, // Ì
{ 9, 29, 11, 1, 29, 66, 3637 }, // Í
{ 11, 29, 11, 0, 29, 80, 3703 }, // Î
{ 10, 28, 12, 1, 28, 70, 3783 }, // Ï
{ 20, 21, 22, 1, 21, 105, 3853 }, // Ð
{ 23, 30, 24, 1, 29, 173, 3958 }, // Ñ
{ 20, 29, 22, 1, 29, 145, 4131 }, // Ò
{ 20, 29, 22, 1, 29, 145, 4276 }, // Ó
{ 20, 30, 22, 1, 30, 150, 4421 }, // Ô
{ 20, 29, 22, 1, 29, 145, 4571 }, // Õ
{ 20, 28, 22, 1, 28, 140, 4716 }, // Ö
{ 12, 13, 18, 3, 17, 39, 4856 }, // ×
{ 22, 21, 22, 0, 21, 116, 4895 }, // Ø
{ 22, 29, 22, 0, 29, 160, 5011 }, // Ù
{ 22, 29, 22, 0, 29, 160, 5171 }, // Ú
{ 22, 30, 22, 0, 30, 165, 5331 }, // Û
{ 22, 28, 22, 0, 28, 154, 5496 }, // Ü
{ 21, 29, 20, 0, 29, 153, 5650 }, // Ý
{ 16, 21, 18, 1, 21, 84, 5803 }, // Þ
{ 19, 23, 19, 0, 23, 110, 5887 }, // ß
{ 16, 25, 16, 1, 25, 100, 5997 }, // à
{ 16, 25, 16, 1, 25, 100, 6097 }, // á
{ 16, 25, 16, 1, 25, 100, 6197 }, // â
{ 16, 23, 16, 1, 23, 92, 6297 }, // ã
{ 16, 23, 16, 1, 23, 92, 6389 }, // ä
{ 16, 26, 16, 1, 26, 104, 6481 }, // å
{ 22, 16, 23, 1, 16, 88, 6585 }, // æ
{ 13, 24, 15, 1, 16, 78, 6673 }, // ç
{ 13, 25, 15, 1, 25, 82, 6751 }, // è
{ 13, 25, 15, 1, 25, 82, 6833 }, // é
{ 13, 25, 15, 1, 25, 82, 6915 }, // ê
{ 13, 23, 15, 1, 23, 75, 6997 }, // ë
{ 9, 25, 10, 1, 25, 57, 7072 }, // ì
{ 9, 25, 10, 1, 25, 57, 7129 }, // í
{ 10, 25, 10, 0, 25, 63, 7186 }, // î
{ 10, 23, 10, 0, 23, 58, 7249 }, // ï
{ 15, 25, 17, 1, 25, 94, 7307 }, // ð
{ 19, 23, 20, 1, 23, 110, 7401 }, // ñ
{ 15, 25, 17, 1, 25, 94, 7511 }, // ò
{ 15, 25, 17, 1, 25, 94, 7605 }, // ó
{ 15, 25, 17, 1, 25, 94, 7699 }, // ô
{ 15, 23, 17, 1, 23, 87, 7793 }, // õ
{ 15, 23, 17, 1, 23, 87, 7880 }, // ö
{ 12, 14, 18, 3, 17, 42, 7967 }, // ÷
{ 17, 16, 17, 0, 16, 68, 8009 }, // ø
{ 20, 25, 19, 0, 25, 125, 8077 }, // ù
{ 20, 25, 19, 0, 25, 125, 8202 }, // ú
{ 20, 25, 19, 0, 25, 125, 8327 }, // û
{ 20, 23, 19, 0, 23, 115, 8452 }, // ü
{ 18, 32, 18, 1, 25, 144, 8567 }, // ý
{ 17, 30, 18, 0, 23, 128, 8711 }, // þ
{ 18, 30, 18, 1, 23, 135, 8839 }, // ÿ
{ 22, 27, 23, 0, 27, 149, 0 }, // Ā
{ 16, 22, 16, 1, 22, 88, 149 }, // ā
{ 22, 29, 23, 0, 29, 160, 237 }, // Ă
{ 16, 24, 16, 1, 24, 96, 397 }, // ă
{ 23, 28, 22, -1, 21, 161, 493 }, // Ą
{ 15, 23, 16, 1, 16, 87, 654 }, // ą
{ 16, 29, 18, 1, 29, 116, 741 }, // Ć
{ 13, 25, 15, 1, 25, 82, 857 }, // ć
{ 16, 30, 18, 1, 30, 120, 939 }, // Ĉ
{ 13, 25, 15, 1, 25, 82, 1059 }, // ĉ
{ 16, 29, 18, 1, 29, 116, 1141 }, // Ċ
{ 13, 23, 15, 1, 23, 75, 1257 }, // ċ
{ 16, 29, 18, 1, 29, 116, 1332 }, // Č
{ 13, 25, 15, 1, 25, 82, 1448 }, // č
{ 20, 29, 21, 1, 29, 145, 1530 }, // Ď
{ 19, 23, 19, 1, 23, 110, 1675 }, // ď
{ 20, 21, 22, 1, 21, 105, 1785 }, // Đ
{ 17, 23, 19, 1, 23, 98, 1890 }, // đ
{ 17, 27, 19, 1, 27, 115, 1988 }, // Ē
{ 13, 22, 15, 1, 22, 72, 2103 }, // ē
{ 17, 29, 19, 1, 29, 124, 2175 }, // Ĕ
{ 13, 24, 15, 1, 24, 78, 2299 }, // ĕ
{ 17, 28, 19, 1, 28, 119, 2377 }, // Ė
{ 13, 23, 15, 1, 23, 75, 2496 }, // ė
{ 17, 28, 19, 1, 21, 119, 2571 }, // Ę
{ 13, 23, 15, 1, 16, 75, 2690 }, // ę
{ 17, 29, 19, 1, 29, 124, 2765 }, // Ě
{ 13, 25, 15, 1, 25, 82, 2889 }, // ě
{ 19, 30, 21, 1, 30, 143, 2971 }, // Ĝ
{ 16, 32, 18, 1, 25, 128, 3114 }, // ĝ
{ 19, 29, 21, 1, 29, 138, 3242 }, // Ğ
{ 16, 31, 18, 1, 24, 124, 3380 }, // ğ
{ 19, 29, 21, 1, 29, 138, 3504 }, // Ġ
{ 16, 30, 18, 1, 23, 120, 3642 }, // ġ
{ 19, 28, 21, 1, 21, 133, 3762 }, // Ģ
{ 16, 33, 18, 1, 26, 132, 3895 }, // ģ
{ 23, 29, 25, 1, 29, 167, 4027 }, // Ĥ
{ 20, 31, 19, -1, 31, 155, 4194 }, // ĥ
{ 23, 21, 25, 1, 21, 121, 4349 }, // Ħ
{ 19, 23, 20, 0, 23, 110, 4470 }, // ħ
{ 9, 29, 11, 1, 29, 66, 4580 }, // Ĩ
{ 9, 23, 11, 1, 23, 52, 4646 }, // ĩ
{ 11, 27, 11, 0, 27, 75, 4698 }, // Ī
{ 10, 22, 10, 0, 22, 55, 4773 }, // ī
{ 9, 29, 11, 1, 29, 66, 4828 }, // Ĭ
{ 9, 24, 11, 1, 24, 54, 4894 }, // ĭ
{ 10, 28, 12, 1, 21, 70, 4948 }, // Į
{ 9, 30, 10, 1, 23, 68, 5018 }, // į
{ 10, 28, 12, 1, 28, 70, 5086 }, // İ
{ 9, 16, 10, 1, 16, 36, 5156 }, // ı
{ 19, 27, 21, 1, 21, 129, 5192 }, // IJ
{ 15, 30, 18, 1, 23, 113, 5321 }, // ij
{ 13, 35, 11, -2, 29, 114, 5434 }, // Ĵ
{ 11, 32, 9, -2, 25, 88, 5548 }, // ĵ
{ 21, 28, 22, 1, 21, 147, 5636 }, // Ķ
{ 18, 30, 17, 0, 23, 135, 5783 }, // ķ
{ 18, 16, 18, 1, 16, 72, 5918 }, // ĸ
{ 17, 29, 18, 1, 29, 124, 5990 }, // Ĺ
{ 9, 31, 9, 0, 31, 70, 6114 }, // ĺ
{ 17, 29, 18, 1, 21, 124, 6184 }, // Ļ
{ 9, 31, 9, 0, 23, 70, 6308 }, // ļ
{ 17, 24, 18, 1, 24, 102, 6378 }, // Ľ
{ 12, 23, 10, 0, 23, 69, 6480 }, // ľ
{ 17, 21, 18, 1, 21, 90, 6549 }, // Ŀ
{ 13, 23, 14, 0, 23, 75, 6639 }, // ŀ
{ 18, 21, 18, 0, 21, 95, 6714 }, // Ł
{ 11, 23, 9, -1, 23, 64, 6809 }, // ł
{ 23, 30, 24, 1, 29, 173, 6873 }, // Ń
{ 19, 25, 20, 1, 25, 119, 7046 }, // ń
{ 23, 29, 24, 1, 21, 167, 7165 }, // Ņ
{ 19, 24, 20, 1, 16, 114, 7332 }, // ņ
{ 23, 30, 24, 1, 29, 173, 7446 }, // Ň
{ 19, 25, 20, 1, 25, 119, 7619 }, // ň
{ 25, 23, 27, 1, 23, 144, 7738 }, // ʼn
{ 23, 27, 24, 1, 21, 156, 7882 }, // Ŋ
{ 16, 23, 19, 1, 16, 92, 8038 }, // ŋ
{ 20, 28, 22, 1, 28, 140, 8130 }, // Ō
{ 15, 22, 17, 1, 22, 83, 8270 }, // ō
{ 20, 29, 22, 1, 29, 145, 8353 }, // Ŏ
{ 15, 24, 17, 1, 24, 90, 8498 }, // ŏ
{ 20, 29, 22, 1, 29, 145, 8588 }, // Ő
{ 15, 24, 17, 1, 24, 90, 8733 }, // ő
{ 26, 21, 28, 1, 21, 137, 8823 }, // Œ
{ 25, 16, 26, 1, 16, 100, 8960 }, // œ
{ 20, 29, 20, 1, 29, 145, 9060 }, // Ŕ
{ 13, 25, 14, 1, 25, 82, 9205 }, // ŕ
{ 20, 28, 20, 1, 21, 140, 9287 }, // Ŗ
{ 13, 24, 14, 1, 16, 78, 9427 }, // ŗ
{ 20, 30, 20, 1, 30, 150, 9505 }, // Ř
{ 13, 25, 13, 0, 25, 82, 9655 }, // ř
{ 14, 29, 16, 1, 29, 102, 9737 }, // Ś
{ 11, 25, 14, 2, 25, 69, 9839 }, // ś
{ 14, 30, 16, 1, 30, 105, 9908 }, // Ŝ
{ 11, 25, 14, 2, 25, 69, 10013 }, // ŝ
{ 14, 29, 16, 1, 21, 102, 10082 }, // Ş
{ 11, 24, 14, 2, 16, 66, 10184 }, // ş
{ 14, 29, 16, 1, 29, 102, 10250 }, // Š
{ 11, 25, 14, 2, 25, 69, 10352 }, // š
{ 18, 29, 20, 1, 21, 131, 10421 }, // Ţ
{ 12, 28, 12, 0, 20, 84, 10552 }, // ţ
{ 18, 29, 20, 1, 29, 131, 10636 }, // Ť
{ 12, 25, 12, 0, 25, 75, 10767 }, // ť
{ 18, 21, 20, 1, 21, 95, 10842 }, // Ŧ
{ 12, 20, 13, 0, 20, 60, 10937 }, // ŧ
{ 22, 29, 22, 0, 29, 160, 10997 }, // Ũ
{ 20, 23, 19, 0, 23, 115, 11157 }, // ũ
{ 22, 28, 22, 0, 28, 154, 11272 }, // Ū
{ 20, 22, 19, 0, 22, 110, 11426 }, // ū
{ 22, 29, 22, 0, 29, 160, 11536 }, // Ŭ
{ 20, 24, 19, 0, 24, 120, 11696 }, // ŭ
{ 22, 31, 22, 0, 31, 171, 11816 }, // Ů
{ 20, 25, 19, 0, 25, 125, 11987 }, // ů
{ 22, 30, 22, 0, 30, 165, 12112 }, // Ű
{ 20, 25, 19, 0, 25, 125, 12277 }, // ű
{ 22, 28, 22, 0, 21, 154, 12402 }, // Ų
{ 20, 23, 20, 0, 16, 115, 12556 }, // ų
{ 32, 29, 32, 0, 29, 232, 12671 }, // Ŵ
{ 26, 25, 26, 0, 25, 163, 12903 }, // ŵ
{ 21, 29, 20, 0, 29, 153, 13066 }, // Ŷ
{ 18, 32, 18, 1, 25, 144, 13219 }, // ŷ
{ 20, 28, 20, 0, 28, 140, 13363 }, // Ÿ
{ 16, 30, 17, 1, 29, 120, 13503 }, // Ź
{ 14, 25, 14, 0, 25, 88, 13623 }, // ź
{ 16, 29, 17, 1, 28, 116, 13711 }, // Ż
{ 14, 23, 14, 0, 23, 81, 13827 }, // ż
{ 16, 30, 17, 1, 29, 120, 13908 }, // Ž
{ 14, 25, 14, 0, 25, 88, 14028 }, // ž
{ 14, 23, 13, 1, 23, 81, 14116 }, // ſ
{ 6, 8, 0, -4, 25, 12, 0 }, // ̀
{ 6, 8, 0, -2, 25, 12, 12 }, // ́
{ 10, 7, 0, -5, 25, 18, 24 }, // ̂
{ 9, 5, 0, -5, 24, 12, 42 }, // ̃
{ 10, 3, 0, -5, 22, 8, 54 }, // ̄
{ 9, 5, 0, -5, 23, 12, 62 }, // ̆
{ 4, 4, 0, -2, 23, 4, 74 }, // ̇
{ 10, 4, 0, -5, 23, 10, 78 }, // ̈
{ 8, 10, 0, -4, 27, 20, 88 }, // ̉
{ 8, 8, 0, -4, 25, 16, 108 }, // ̊
{ 10, 8, 0, -4, 25, 20, 124 }, // ̋
{ 10, 6, 0, -5, 24, 15, 144 }, // ̌
{ 10, 8, 0, -6, 25, 20, 159 }, // ̏
{ 9, 6, 0, -5, 24, 14, 179 }, // ̑
{ 5, 8, 0, -2, 25, 10, 193 }, // ̒
{ 6, 8, 0, -1, 26, 12, 203 }, // ̓
{ 5, 8, 0, -3, 26, 10, 215 }, // ̔
{ 3, 9, 0, -1, 27, 7, 225 }, // ̕
{ 5, 7, 0, -2, 19, 9, 232 }, // ̛
{ 4, 4, 0, -2, -3, 4, 241 }, // ̣
{ 10, 4, 0, -5, -2, 10, 245 }, // ̤
{ 6, 7, 0, -3, -1, 11, 255 }, // ̥
{ 6, 6, 0, -3, -2, 9, 266 }, // ̦
{ 7, 8, 0, -3, 0, 14, 275 }, // ̧
{ 6, 8, 0, -3, 2, 12, 289 }, // ̨
{ 4, 6, 9, 3, -2, 6, 301 }, // ̩
{ 10, 6, 0, -5, -2, 15, 307 }, // ̭
{ 9, 5, 0, -5, -2, 12, 322 }, // ̮
{ 9, 5, 0, -5, -2, 12, 334 }, // ̰
{ 10, 3, 0, -5, -3, 8, 346 }, // ̱
{ 9, 6, 0, -5, 24, 14, 354 }, // ͂
{ 10, 12, 0, -5, 31, 30, 368 }, // ̈́
{ 6, 5, 0, -1, -2, 8, 398 }, // ͅ
{ 17, 29, 19, 1, 29, 124, 0 }, // Ѐ
{ 17, 28, 19, 1, 28, 119, 124 }, // Ё
{ 22, 28, 23, 1, 21, 154, 243 }, // Ђ
{ 16, 29, 17, 1, 29, 116, 397 }, // Ѓ
{ 17, 21, 19, 1, 21, 90, 513 }, // Є
{ 14, 21, 16, 1, 21, 74, 603 }, // Ѕ
{ 9, 21, 11, 1, 21, 48, 677 }, // І
{ 10, 28, 12, 1, 28, 70, 725 }, // Ї
{ 12, 27, 11, -2, 21, 81, 795 }, // Ј
{ 27, 21, 29, 1, 21, 142, 876 }, // Љ
{ 28, 21, 30, 1, 21, 147, 1018 }, // Њ
{ 24, 21, 25, 1, 21, 126, 1165 }, // Ћ
{ 20, 29, 21, 1, 29, 145, 1291 }, // Ќ
{ 23, 29, 24, 1, 29, 167, 1436 }, // Ѝ
{ 21, 29, 21, 0, 29, 153, 1603 }, // Ў
{ 22, 28, 23, 1, 21, 154, 1756 }, // Џ
{ 22, 21, 23, 0, 21, 116, 1910 }, // А
{ 17, 21, 19, 1, 21, 90, 2026 }, // Б
{ 17, 21, 18, 1, 21, 90, 2116 }, // В
{ 16, 21, 17, 1, 21, 84, 2206 }, // Г
{ 20, 27, 22, 1, 21, 135, 2290 }, // Д
{ 17, 21, 19, 1, 21, 90, 2425 }, // Е
{ 29, 21, 29, 0, 21, 153, 2515 }, // Ж
{ 15, 21, 17, 1, 21, 79, 2668 }, // З
{ 23, 21, 24, 1, 21, 121, 2747 }, // И
{ 23, 29, 24, 1, 29, 167, 2868 }, // Й
{ 20, 21, 21, 1, 21, 105, 3035 }, // К
{ 21, 21, 22, 1, 21, 111, 3140 }, // Л
{ 26, 21, 27, 0, 21, 137, 3251 }, // М
{ 23, 21, 25, 1, 21, 121, 3388 }, // Н
{ 20, 21, 22, 1, 21, 105, 3509 }, // О
{ 22, 21, 24, 1, 21, 116, 3614 }, // П
{ 16, 21, 18, 1, 21, 84, 3730 }, // Р
{ 16, 21, 18, 1, 21, 84, 3814 }, // С
{ 18, 21, 20, 1, 21, 95, 3898 }, // Т
{ 22, 21, 22, 0, 21, 116, 3993 }, // У
{ 21, 22, 23, 1, 22, 116, 4109 }, // Ф
{ 21, 21, 22, 0, 21, 111, 4225 }, // Х
{ 22, 27, 23, 1, 21, 149, 4336 }, // Ц
{ 20, 21, 21, 0, 21, 105, 4485 }, // Ч
{ 30, 21, 31, 1, 21, 158, 4590 }, // Ш
{ 30, 27, 31, 1, 21, 203, 4748 }, // Щ
{ 21, 21, 22, 1, 21, 111, 4951 }, // Ъ
{ 26, 21, 28, 1, 21, 137, 5062 }, // Ы
{ 17, 21, 19, 1, 21, 90, 5199 }, // Ь
{ 18, 21, 19, 1, 21, 95, 5289 }, // Э
{ 29, 21, 30, 1, 21, 153, 5384 }, // Ю
{ 20, 21, 20, -1, 21, 105, 5537 }, // Я
{ 16, 16, 16, 1, 16, 64, 5642 }, // а
{ 15, 25, 17, 1, 25, 94, 5706 }, // б
{ 15, 15, 16, 1, 15, 57, 5800 }, // в
{ 13, 15, 15, 1, 15, 49, 5857 }, // г
{ 17, 21, 19, 1, 15, 90, 5906 }, // д
{ 13, 16, 15, 1, 16, 52, 5996 }, // е
{ 25, 16, 23, -1, 16, 100, 6048 }, // ж
{ 13, 16, 13, 0, 16, 52, 6148 }, // з
{ 19, 15, 21, 1, 15, 72, 6200 }, // и
{ 19, 23, 21, 1, 23, 110, 6272 }, // й
{ 16, 16, 17, 1, 16, 64, 6382 }, // к
{ 17, 15, 19, 1, 15, 64, 6446 }, // л
{ 21, 15, 23, 1, 15, 79, 6510 }, // м
{ 19, 15, 21, 1, 15, 72, 6589 }, // н
{ 15, 16, 17, 1, 16, 60, 6661 }, // о
{ 19, 15, 21, 1, 15, 72, 6721 }, // п
{ 17, 23, 19, 1, 16, 98, 6793 }, // р
{ 13, 16, 15, 1, 16, 52, 6891 }, // с
{ 15, 15, 16, 1, 15, 57, 6943 }, // т
{ 18, 22, 18, 0, 15, 99, 7000 }, // у
{ 20, 30, 21, 1, 23, 150, 7099 }, // ф
{ 18, 15, 17, -1, 15, 68, 7249 }, // х
{ 19, 21, 20, 1, 15, 100, 7317 }, // ц
{ 18, 15, 18, -1, 15, 68, 7417 }, // ч
{ 24, 15, 25, 0, 15, 90, 7485 }, // ш
{ 25, 21, 25, 0, 15, 132, 7575 }, // щ
{ 18, 15, 19, 1, 15, 68, 7707 }, // ъ
{ 22, 15, 24, 1, 15, 83, 7775 }, // ы
{ 15, 15, 16, 1, 15, 57, 7858 }, // ь
{ 14, 16, 15, 1, 16, 56, 7915 }, // э
{ 23, 16, 25, 1, 16, 92, 7971 }, // ю
{ 16, 15, 17, 0, 15, 60, 8063 }, // я
{ 13, 25, 15, 1, 25, 82, 8123 }, // ѐ
{ 13, 23, 15, 1, 23, 75, 8205 }, // ё
{ 17, 31, 19, 0, 24, 132, 8280 }, // ђ
{ 13, 25, 15, 1, 25, 82, 8412 }, // ѓ
{ 13, 16, 15, 1, 16, 52, 8494 }, // є
{ 11, 16, 14, 2, 16, 44, 8546 }, // ѕ
{ 9, 23, 10, 1, 23, 52, 8590 }, // і
{ 10, 23, 10, 0, 23, 58, 8642 }, // ї
{ 8, 30, 8, -2, 23, 60, 8700 }, // ј
{ 24, 15, 24, 0, 15, 90, 8760 }, // љ
{ 23, 15, 25, 1, 15, 87, 8850 }, // њ
{ 19, 24, 20, 0, 24, 114, 8937 }, // ћ
{ 16, 25, 17, 1, 25, 100, 9051 }, // ќ
{ 19, 25, 21, 1, 25, 119, 9151 }, // ѝ
{ 18, 30, 18, 0, 23, 135, 9270 }, // ў
{ 18, 21, 20, 1, 15, 95, 9405 }, // џ
{ 21, 24, 21, 0, 24, 126, 9500 }, // Ѣ
{ 17, 21, 18, 1, 21, 90, 9626 }, // ѣ
{ 20, 21, 22, 1, 21, 105, 9716 }, // Ѳ
{ 15, 16, 17, 1, 16, 60, 9821 }, // ѳ
{ 22, 21, 22, 0, 21, 116, 9881 }, // Ѵ
{ 18, 16, 18, 0, 16, 72, 9997 }, // ѵ
{ 23, 35, 24, 1, 29, 202, 10069 }, // Ҋ
{ 19, 29, 20, 1, 23, 138, 10271 }, // ҋ
{ 17, 21, 19, 1, 21, 90, 10409 }, // Ҍ
{ 15, 21, 16, 0, 21, 79, 10499 }, // ҍ
{ 16, 21, 18, 1, 21, 84, 10578 }, // Ҏ
{ 17, 23, 19, 1, 16, 98, 10662 }, // ҏ
{ 15, 25, 16, 1, 25, 94, 10760 }, // Ґ
{ 13, 19, 14, 1, 19, 62, 10854 }, // ґ
{ 16, 21, 17, 1, 21, 84, 10916 }, // Ғ
{ 13, 15, 15, 1, 15, 49, 11000 }, // ғ
{ 18, 28, 19, 1, 21, 126, 11049 }, // Ҕ
{ 16, 22, 18, 1, 15, 88, 11175 }, // ҕ
{ 29, 27, 29, 0, 21, 196, 11263 }, // Җ
{ 25, 21, 23, -1, 16, 132, 11459 }, // җ
{ 15, 27, 17, 1, 21, 102, 11591 }, // Ҙ
{ 13, 22, 13, 0, 16, 72, 11693 }, // ҙ
{ 20, 27, 21, 1, 21, 135, 11765 }, // Қ
{ 17, 22, 17, 1, 16, 94, 11900 }, // қ
{ 21, 21, 22, 1, 21, 111, 11994 }, // Ҝ
{ 17, 16, 17, 1, 16, 68, 12105 }, // ҝ
{ 20, 21, 21, 1, 21, 105, 12173 }, // Ҟ
{ 17, 21, 17, 0, 21, 90, 12278 }, // ҟ
{ 24, 21, 25, 1, 21, 126, 12368 }, // Ҡ
{ 19, 16, 19, 1, 16, 76, 12494 }, // ҡ
{ 23, 27, 24, 1, 21, 156, 12570 }, // Ң
{ 19, 21, 21, 1, 15, 100, 12726 }, // ң
{ 26, 21, 28, 1, 21, 137, 12826 }, // Ҥ
{ 22, 15, 23, 1, 15, 83, 12963 }, // ҥ
{ 29, 28, 31, 1, 21, 203, 13046 }, // Ҧ
{ 27, 22, 29, 1, 15, 149, 13249 }, // ҧ
{ 22, 21, 24, 1, 21, 116, 13398 }, // Ҩ
{ 17, 16, 19, 1, 16, 68, 13514 }, // ҩ
{ 16, 27, 18, 1, 21, 108, 13582 }, // Ҫ
{ 13, 23, 15, 1, 16, 75, 13690 }, // ҫ
{ 18, 27, 20, 1, 21, 122, 13765 }, // Ҭ
{ 15, 21, 16, 1, 15, 79, 13887 }, // ҭ
{ 21, 21, 20, 0, 21, 111, 13966 }, // Ү
{ 17, 22, 17, 0, 15, 94, 14077 }, // ү
{ 20, 21, 21, 1, 21, 105, 14171 }, // Ұ
{ 17, 22, 17, 0, 15, 94, 14276 }, // ұ
{ 21, 27, 22, 0, 21, 142, 14370 }, // Ҳ
{ 18, 21, 17, -1, 15, 95, 14512 }, // ҳ
{ 25, 27, 26, 1, 21, 169, 14607 }, // Ҵ
{ 22, 21, 22, 0, 15, 116, 14776 }, // ҵ
{ 20, 27, 20, 0, 21, 135, 14892 }, // Ҷ
{ 18, 21, 18, -1, 15, 95, 15027 }, // ҷ
{ 20, 21, 21, 0, 21, 105, 15122 }, // Ҹ
{ 18, 15, 18, -1, 15, 68, 15227 }, // ҹ
{ 20, 21, 21, 1, 21, 105, 15295 }, // Һ
{ 19, 23, 19, 0, 23, 110, 15400 }, // һ
{ 22, 21, 24, 1, 21, 116, 15510 }, // Ҽ
{ 18, 16, 19, 1, 16, 72, 15626 }, // ҽ
{ 22, 28, 24, 1, 21, 154, 15698 }, // Ҿ
{ 18, 23, 19, 1, 16, 104, 15852 }, // ҿ
{ 9, 21, 11, 1, 21, 48, 15956 }, // Ӏ
{ 30, 29, 29, 0, 29, 218, 16004 }, // Ӂ
{ 24, 23, 23, -1, 23, 138, 16222 }, // ӂ
{ 19, 28, 20, 0, 21, 133, 16360 }, // Ӄ
{ 15, 23, 18, 1, 16, 87, 16493 }, // ӄ
{ 20, 27, 22, 1, 21, 135, 16580 }, // Ӆ
{ 17, 20, 19, 1, 15, 85, 16715 }, // ӆ
{ 23, 28, 24, 1, 21, 161, 16800 }, // Ӈ
{ 19, 22, 21, 1, 15, 105, 16961 }, // ӈ
{ 23, 27, 25, 1, 21, 156, 17066 }, // Ӊ
{ 19, 21, 21, 1, 15, 100, 17222 }, // ӊ
{ 20, 27, 20, 0, 21, 135, 17322 }, // Ӌ
{ 17, 21, 17, -1, 15, 90, 17457 }, // ӌ
{ 26, 27, 27, 0, 21, 176, 17547 }, // Ӎ
{ 21, 21, 23, 1, 15, 111, 17723 }, // ӎ
{ 9, 23, 9, 0, 23, 52, 17834 }, // ӏ
{ 23, 29, 22, -1, 29, 167, 17886 }, // Ӑ
{ 15, 23, 15, 1, 23, 87, 18053 }, // ӑ
{ 22, 28, 22, -1, 28, 154, 18140 }, // Ӓ
{ 16, 23, 16, 1, 23, 92, 18294 }, // ӓ
{ 27, 21, 27, -1, 21, 142, 18386 }, // Ӕ
{ 22, 16, 23, 1, 16, 88, 18528 }, // ӕ
{ 17, 29, 19, 1, 29, 124, 18616 }, // Ӗ
{ 13, 23, 15, 1, 23, 75, 18740 }, // ӗ
{ 17, 21, 20, 2, 21, 90, 18815 }, // Ә
{ 13, 16, 15, 1, 16, 52, 18905 }, // ә
{ 17, 28, 20, 2, 28, 119, 18957 }, // Ӛ
{ 13, 23, 15, 1, 23, 75, 19076 }, // ӛ
{ 30, 28, 30, 0, 28, 210, 19151 }, // Ӝ
{ 24, 23, 24, 0, 23, 138, 19361 }, // ӝ
{ 15, 28, 16, 1, 28, 105, 19499 }, // Ӟ
{ 13, 23, 13, 0, 23, 75, 19604 }, // ӟ
{ 16, 21, 16, 0, 21, 84, 19679 }, // Ӡ
{ 14, 22, 14, 0, 15, 77, 19763 }, // ӡ
{ 23, 27, 24, 1, 27, 156, 19840 }, // Ӣ
{ 19, 22, 21, 1, 22, 105, 19996 }, // ӣ
{ 23, 28, 24, 1, 28, 161, 20101 }, // Ӥ
{ 19, 23, 21, 1, 23, 110, 20262 }, // ӥ
{ 20, 28, 22, 1, 28, 140, 20372 }, // Ӧ
{ 15, 23, 17, 1, 23, 87, 20512 }, // ӧ
{ 20, 21, 22, 1, 21, 105, 20599 }, // Ө
{ 15, 16, 17, 1, 16, 60, 20704 }, // ө
{ 20, 28, 24, 1, 28, 140, 20764 }, // Ӫ
{ 15, 23, 17, 1, 23, 87, 20904 }, // ӫ
{ 17, 28, 19, 1, 28, 119, 20991 }, // Ӭ
{ 14, 23, 15, 1, 23, 81, 21110 }, // ӭ
{ 22, 28, 22, 0, 28, 154, 21191 }, // Ӯ
{ 18, 29, 18, 0, 22, 131, 21345 }, // ӯ
{ 21, 28, 21, 0, 28, 147, 21476 }, // Ӱ
{ 19, 30, 18, 0, 23, 143, 21623 }, // ӱ
{ 22, 30, 22, 0, 30, 165, 21766 }, // Ӳ
{ 18, 32, 18, 0, 25, 144, 21931 }, // ӳ
{ 20, 28, 21, 0, 28, 140, 22075 }, // Ӵ
{ 18, 23, 18, -1, 23, 104, 22215 }, // ӵ
{ 15, 27, 17, 1, 21, 102, 22319 }, // Ӷ
{ 13, 21, 15, 1, 15, 69, 22421 }, // ӷ
{ 26, 28, 29, 1, 28, 182, 22490 }, // Ӹ
{ 22, 23, 24, 1, 23, 127, 22672 }, // ӹ
{ 16, 27, 17, 1, 21, 108, 22799 }, // Ӻ
{ 13, 21, 15, 1, 15, 69, 22907 }, // ӻ
{ 21, 28, 21, 0, 21, 147, 22976 }, // Ӽ
{ 18, 22, 18, 0, 15, 99, 23123 }, // ӽ
{ 22, 21, 22, 0, 21, 116, 23222 }, // Ӿ
{ 17, 15, 18, 0, 15, 64, 23338 }, // ӿ
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
{ 0, 0, 15, 0, 0, 0, 0 }, //  
{ 0, 0, 29, 0, 0, 0, 0 }, //
{ 0, 0, 15, 0, 0, 0, 0 }, //
{ 0, 0, 29, 0, 0, 0, 0 }, //
{ 0, 0, 10, 0, 0, 0, 0 }, //
{ 0, 0, 7, 0, 0, 0, 0 }, //
{ 0, 0, 5, 0, 0, 0, 0 }, //
{ 0, 0, 18, 0, 0, 0, 0 }, //
{ 0, 0, 8, 0, 0, 0, 0 }, //
{ 0, 0, 6, 0, 0, 0, 0 }, //
{ 0, 0, 1, 0, 0, 0, 0 }, //
{ 0, 0, 0, 0, 0, 0, 0 }, //
{ 2, 24, 0, -1, 17, 12, 0 }, //
fix: force auto-hinting for Bookerly to fix inconsistent stem widths (#1098) ## Summary Bookerly's native TrueType hinting is effectively a no-op at the sizes used here, causing FreeType to place stems at inconsistent sub-pixel positions. This results in the 'k' stem (8-bit fringe: 0x38=56) falling just below the 2-bit quantization threshold while 'l' and 'h' stems (fringes: 0x4C=76, 0x40=64) land above it --- making 'k' visibly narrower (2.00px vs 2.33px effective width). FreeType's auto-hinter snaps all stems to consistent grid positions, normalizing effective stem width to 2.67px across all glyphs. Adds --force-autohint flag to fontconvert.py and applies it to Bookerly only. NotoSans, OpenDyslexic, and Ubuntu fonts are unaffected. Here is an example of before/after. Take notice of the vertical stems on characters like `l`, `k`, `n`, `i`, etc. The font is Bookerly 12pt regular: **BEFORE**: ![before](https://github.com/user-attachments/assets/65b2acab-ad95-489e-885e-e3a0163cc252) **AFTER**: ![after](https://github.com/user-attachments/assets/d09a8b5d-40af-4a7d-b622-e1b2cabcce85) Claude generated this script to quantitatively determine that this change makes the vertical stems on a variety of characters more consistent for Bookerly _only_. <details> <summary>Python script</summary> ```python #!/usr/bin/env python3 """Compare stem consistency across all font families with and without auto-hinting. Run from repo root: python3 compare_all_fonts.py """ import freetype DPI = 150 CHARS = ["k", "l", "h", "i", "b", "d"] SIZES = [12, 14, 16, 18] FONTS = { "Bookerly": "lib/EpdFont/builtinFonts/source/Bookerly/Bookerly-Regular.ttf", "NotoSans": "lib/EpdFont/builtinFonts/source/NotoSans/NotoSans-Regular.ttf", "OpenDyslexic": "lib/EpdFont/builtinFonts/source/OpenDyslexic/OpenDyslexic-Regular.otf", "Ubuntu": "lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Regular.ttf", } MODES = { "default": freetype.FT_LOAD_RENDER, "autohint": freetype.FT_LOAD_RENDER | freetype.FT_LOAD_FORCE_AUTOHINT, } def q4to2(v): if v >= 12: return 3 elif v >= 8: return 2 elif v >= 4: return 1 else: return 0 def get_stem_eff(face, char, flags): gi = face.get_char_index(ord(char)) if gi == 0: return None face.load_glyph(gi, flags) bm = face.glyph.bitmap w, h = bm.width, bm.rows if w == 0 or h == 0: return None p2 = [] for y in range(h): row = [] for x in range(w): row.append(q4to2(bm.buffer[y * bm.pitch + x] >> 4)) p2.append(row) # Measure leftmost stem in stable middle rows mid_start, mid_end = h // 4, h - h // 4 widths = [] for y in range(mid_start, mid_end): first = next((x for x in range(w) if p2[y][x] > 0), -1) if first < 0: continue last = first for x in range(first, w): if p2[y][x] > 0: last = x else: break eff = sum(p2[y][x] for x in range(first, last + 1)) / 3.0 widths.append(eff) return round(sum(widths) / len(widths), 2) if widths else None def main(): for font_name, font_path in FONTS.items(): try: freetype.Face(font_path) except Exception: print(f"\n {font_name}: SKIPPED (file not found)") continue print(f"\n{'=' * 80}") print(f" {font_name}") print(f"{'=' * 80}") for size in SIZES: print(f"\n {size}pt:") print(f" {'':6s}", end="") for c in CHARS: print(f" '{c}' ", end="") print(" | spread") for mode_name, flags in MODES.items(): face = freetype.Face(font_path) face.set_char_size(size << 6, size << 6, DPI, DPI) vals = [] print(f" {mode_name:6s}", end="") for c in CHARS: v = get_stem_eff(face, c, flags) vals.append(v) print(f" {v:5.2f}" if v else " N/A", end="") valid = [v for v in vals if v is not None] spread = max(valid) - min(valid) if len(valid) >= 2 else 0 marker = " <-- inconsistent" if spread > 0.5 else "" print(f" | {spread:.2f}{marker}") if __name__ == "__main__": main() ``` </details> Here are the results. The table compares how the font-generation `autohint` flag affects the range of widths of various characters. Lower `spread` mean that glyph stroke widths should appear more consistent. ``` Spread = max stem width - min stem width across glyphs (lower = more consistent): ┌──────────────┬──────┬─────────┬──────────┬──────────┐ │ Font │ Size │ Default │ Autohint │ Winner │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Bookerly │ 12pt │ 1.49 │ 1.12 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.39 │ 1.13 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.38 │ 1.16 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.90 │ 1.58 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ NotoSans │ 12pt │ 1.16 │ 0.94 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 0.83 │ 1.14 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.41 │ 1.51 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.74 │ 1.63 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ OpenDyslexic │ 12pt │ 2.22 │ 1.44 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 2.57 │ 3.29 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 3.13 │ 2.60 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 3.21 │ 3.23 │ ~tied │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Ubuntu │ 12pt │ 1.25 │ 1.31 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.41 │ 1.64 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 2.21 │ 1.71 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.80 │ 1.71 │ autohint │ └──────────────┴──────┴─────────┴──────────┴──────────┘ ``` --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? I used AI to make sure I'm not doing something stupid, since I'm not a typography expert. I made the changes though.
2026-02-24 06:13:08 +11:00
{ 7, 27, 0, -3, 20, 48, 12 }, //
{ 11, 28, 0, -5, 21, 77, 60 }, //
{ 10, 28, 0, -5, 21, 70, 137 }, //
{ 9, 3, 11, 1, 9, 7, 207 }, //
{ 9, 3, 11, 1, 9, 7, 214 }, //
{ 13, 3, 17, 2, 12, 10, 221 }, //
{ 15, 3, 15, 0, 10, 12, 231 }, //
{ 29, 3, 29, 0, 10, 22, 243 }, // —
{ 29, 3, 29, 0, 10, 22, 265 }, // ―
{ 9, 30, 15, 3, 23, 68, 287 }, // ‖
{ 15, 6, 15, 0, -1, 23, 355 }, // ‗
{ 5, 9, 7, 1, 22, 12, 378 }, //
{ 6, 9, 7, 1, 22, 14, 390 }, //
{ 6, 9, 7, 1, 4, 14, 404 }, //
{ 5, 9, 7, 1, 22, 12, 418 }, //
{ 11, 9, 13, 1, 22, 25, 430 }, // “
{ 11, 9, 13, 1, 22, 25, 455 }, // ”
{ 11, 9, 13, 1, 4, 25, 480 }, // „
{ 11, 9, 13, 1, 22, 25, 505 }, // ‟
{ 13, 19, 15, 1, 21, 62, 530 }, // †
{ 13, 23, 15, 1, 21, 75, 592 }, // ‡
{ 6, 6, 8, 1, 11, 9, 667 }, // •
{ 10, 11, 18, 4, 16, 28, 676 }, // ‣
{ 4, 4, 8, 2, 4, 4, 704 }, //
{ 11, 4, 15, 2, 4, 11, 708 }, // ‥
{ 24, 4, 30, 3, 4, 24, 719 }, // …
{ 4, 4, 8, 2, 10, 4, 743 }, // ‧
{ 0, 0, 0, 0, 0, 0, 747 }, //
{ 0, 0, 0, 0, 0, 0, 747 }, //
{ 10, 28, 0, -5, 21, 70, 747 }, //
{ 9, 28, 0, -5, 21, 63, 817 }, //
{ 9, 28, 0, -4, 21, 63, 880 }, //
{ 13, 28, 0, -7, 21, 91, 943 }, //
{ 12, 28, 0, -6, 21, 84, 1034 }, //
{ 0, 0, 3, 0, 0, 0, 1118 }, //
{ 37, 23, 41, 2, 22, 213, 1118 }, // ‰
{ 6, 10, 8, 1, 21, 15, 1331 }, //
{ 12, 10, 14, 1, 21, 30, 1346 }, // ″
{ 18, 10, 20, 1, 21, 45, 1376 }, // ‴
{ 6, 10, 8, 1, 21, 15, 1421 }, //
{ 12, 10, 14, 1, 21, 30, 1436 }, // ‶
{ 18, 10, 20, 1, 21, 45, 1466 }, // ‷
{ 13, 7, 15, 1, 1, 23, 1511 }, // ‸
{ 7, 11, 9, 1, 13, 20, 1534 }, //
{ 7, 11, 9, 1, 13, 20, 1554 }, //
{ 19, 20, 19, 0, 20, 95, 1574 }, // ※
{ 12, 23, 17, 3, 23, 69, 1669 }, // ‼
{ 15, 3, 15, 0, 25, 12, 1738 }, // ‾
{ 7, 3, 9, 1, 9, 6, 1750 }, //
{ 15, 24, 5, -5, 22, 90, 1756 }, //
{ 23, 22, 26, 2, 22, 127, 1846 }, // ⁇
{ 18, 23, 22, 2, 23, 104, 1973 }, // ⁈
{ 18, 23, 23, 3, 23, 104, 2077 }, // ⁉
{ 17, 6, 29, 6, 12, 26, 2181 }, //
{ 23, 10, 25, 1, 21, 58, 2207 }, // ⁗
{ 0, 0, 6, 0, 0, 0, 2265 }, //
{ 0, 0, 0, 0, 0, 0, 2265 }, //
{ 0, 0, 0, 0, 0, 0, 2265 }, //
{ 0, 0, 0, 0, 0, 0, 2265 }, //
{ 0, 0, 0, 0, 0, 0, 2265 }, //
{ 0, 0, 0, 0, 0, 0, 2265 }, //
{ 11, 13, 13, 1, 24, 36, 0 }, // ⁰
{ 12, 14, 13, 0, 25, 42, 36 }, // ⁴
{ 10, 13, 13, 1, 24, 33, 78 }, // ⁵
{ 10, 13, 14, 2, 24, 33, 111 }, // ⁶
{ 9, 13, 12, 2, 24, 30, 144 }, // ⁷
{ 10, 13, 13, 2, 24, 33, 174 }, // ⁸
{ 10, 13, 13, 2, 24, 33, 207 }, // ⁹
{ 13, 10, 16, 2, 21, 33, 240 }, // ⁿ
{ 11, 13, 13, 1, 9, 36, 273 }, // ₀
{ 9, 14, 13, 2, 10, 32, 309 }, // ₁
{ 11, 13, 13, 1, 9, 36, 341 }, // ₂
{ 9, 13, 13, 2, 9, 30, 377 }, // ₃
{ 12, 14, 13, 0, 10, 42, 407 }, // ₄
{ 10, 13, 13, 1, 9, 33, 449 }, // ₅
{ 10, 13, 14, 2, 9, 33, 482 }, // ₆
{ 9, 13, 12, 2, 9, 30, 515 }, // ₇
{ 10, 13, 13, 2, 9, 33, 545 }, // ₈
{ 10, 13, 13, 2, 9, 33, 578 }, // ₉
{ 15, 21, 18, 1, 21, 79, 0 }, // ₣
{ 16, 21, 17, 1, 21, 84, 79 }, // ₤
{ 35, 21, 37, 1, 21, 184, 163 }, // ₧
{ 18, 21, 18, 0, 21, 95, 347 }, // €
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
{ 17, 12, 29, 6, 16, 51, 0 }, // ←
fix: force auto-hinting for Bookerly to fix inconsistent stem widths (#1098) ## Summary Bookerly's native TrueType hinting is effectively a no-op at the sizes used here, causing FreeType to place stems at inconsistent sub-pixel positions. This results in the 'k' stem (8-bit fringe: 0x38=56) falling just below the 2-bit quantization threshold while 'l' and 'h' stems (fringes: 0x4C=76, 0x40=64) land above it --- making 'k' visibly narrower (2.00px vs 2.33px effective width). FreeType's auto-hinter snaps all stems to consistent grid positions, normalizing effective stem width to 2.67px across all glyphs. Adds --force-autohint flag to fontconvert.py and applies it to Bookerly only. NotoSans, OpenDyslexic, and Ubuntu fonts are unaffected. Here is an example of before/after. Take notice of the vertical stems on characters like `l`, `k`, `n`, `i`, etc. The font is Bookerly 12pt regular: **BEFORE**: ![before](https://github.com/user-attachments/assets/65b2acab-ad95-489e-885e-e3a0163cc252) **AFTER**: ![after](https://github.com/user-attachments/assets/d09a8b5d-40af-4a7d-b622-e1b2cabcce85) Claude generated this script to quantitatively determine that this change makes the vertical stems on a variety of characters more consistent for Bookerly _only_. <details> <summary>Python script</summary> ```python #!/usr/bin/env python3 """Compare stem consistency across all font families with and without auto-hinting. Run from repo root: python3 compare_all_fonts.py """ import freetype DPI = 150 CHARS = ["k", "l", "h", "i", "b", "d"] SIZES = [12, 14, 16, 18] FONTS = { "Bookerly": "lib/EpdFont/builtinFonts/source/Bookerly/Bookerly-Regular.ttf", "NotoSans": "lib/EpdFont/builtinFonts/source/NotoSans/NotoSans-Regular.ttf", "OpenDyslexic": "lib/EpdFont/builtinFonts/source/OpenDyslexic/OpenDyslexic-Regular.otf", "Ubuntu": "lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Regular.ttf", } MODES = { "default": freetype.FT_LOAD_RENDER, "autohint": freetype.FT_LOAD_RENDER | freetype.FT_LOAD_FORCE_AUTOHINT, } def q4to2(v): if v >= 12: return 3 elif v >= 8: return 2 elif v >= 4: return 1 else: return 0 def get_stem_eff(face, char, flags): gi = face.get_char_index(ord(char)) if gi == 0: return None face.load_glyph(gi, flags) bm = face.glyph.bitmap w, h = bm.width, bm.rows if w == 0 or h == 0: return None p2 = [] for y in range(h): row = [] for x in range(w): row.append(q4to2(bm.buffer[y * bm.pitch + x] >> 4)) p2.append(row) # Measure leftmost stem in stable middle rows mid_start, mid_end = h // 4, h - h // 4 widths = [] for y in range(mid_start, mid_end): first = next((x for x in range(w) if p2[y][x] > 0), -1) if first < 0: continue last = first for x in range(first, w): if p2[y][x] > 0: last = x else: break eff = sum(p2[y][x] for x in range(first, last + 1)) / 3.0 widths.append(eff) return round(sum(widths) / len(widths), 2) if widths else None def main(): for font_name, font_path in FONTS.items(): try: freetype.Face(font_path) except Exception: print(f"\n {font_name}: SKIPPED (file not found)") continue print(f"\n{'=' * 80}") print(f" {font_name}") print(f"{'=' * 80}") for size in SIZES: print(f"\n {size}pt:") print(f" {'':6s}", end="") for c in CHARS: print(f" '{c}' ", end="") print(" | spread") for mode_name, flags in MODES.items(): face = freetype.Face(font_path) face.set_char_size(size << 6, size << 6, DPI, DPI) vals = [] print(f" {mode_name:6s}", end="") for c in CHARS: v = get_stem_eff(face, c, flags) vals.append(v) print(f" {v:5.2f}" if v else " N/A", end="") valid = [v for v in vals if v is not None] spread = max(valid) - min(valid) if len(valid) >= 2 else 0 marker = " <-- inconsistent" if spread > 0.5 else "" print(f" | {spread:.2f}{marker}") if __name__ == "__main__": main() ``` </details> Here are the results. The table compares how the font-generation `autohint` flag affects the range of widths of various characters. Lower `spread` mean that glyph stroke widths should appear more consistent. ``` Spread = max stem width - min stem width across glyphs (lower = more consistent): ┌──────────────┬──────┬─────────┬──────────┬──────────┐ │ Font │ Size │ Default │ Autohint │ Winner │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Bookerly │ 12pt │ 1.49 │ 1.12 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.39 │ 1.13 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.38 │ 1.16 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.90 │ 1.58 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ NotoSans │ 12pt │ 1.16 │ 0.94 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 0.83 │ 1.14 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.41 │ 1.51 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.74 │ 1.63 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ OpenDyslexic │ 12pt │ 2.22 │ 1.44 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 2.57 │ 3.29 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 3.13 │ 2.60 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 3.21 │ 3.23 │ ~tied │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Ubuntu │ 12pt │ 1.25 │ 1.31 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.41 │ 1.64 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 2.21 │ 1.71 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.80 │ 1.71 │ autohint │ └──────────────┴──────┴─────────┴──────────┴──────────┘ ``` --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? I used AI to make sure I'm not doing something stupid, since I'm not a typography expert. I made the changes though.
2026-02-24 06:13:08 +11:00
{ 12, 20, 29, 9, 20, 60, 51 }, // ↑
{ 17, 12, 29, 6, 16, 51, 111 }, // →
{ 12, 20, 29, 9, 20, 60, 162 }, // ↓
{ 18, 12, 29, 6, 16, 54, 222 }, // ↔
{ 12, 19, 29, 9, 20, 57, 276 }, // ↕
{ 13, 19, 29, 8, 20, 62, 333 }, // ↨
{ 13, 19, 29, 8, 20, 62, 395 }, // ↲
{ 13, 19, 29, 8, 20, 62, 457 }, // ↳
{ 16, 14, 29, 7, 17, 56, 519 }, // ↵
{ 17, 14, 29, 6, 17, 60, 575 }, // ⇐
{ 14, 18, 29, 8, 19, 63, 635 }, // ⇑
{ 17, 14, 29, 6, 17, 60, 698 }, // ⇒
{ 14, 18, 29, 8, 19, 63, 758 }, // ⇓
{ 19, 14, 29, 5, 17, 67, 821 }, // ⇔
{ 20, 22, 29, 5, 21, 110, 0 }, // ∀
{ 14, 24, 18, 2, 23, 84, 110 }, // ∂
{ 13, 21, 29, 8, 21, 69, 194 }, // ∃
{ 22, 22, 29, 3, 21, 121, 263 }, // ∅
{ 19, 21, 19, 0, 21, 100, 384 }, // ∆
{ 18, 22, 29, 6, 21, 99, 484 }, // ∇
{ 20, 21, 29, 5, 21, 105, 583 }, // ∈
{ 20, 26, 29, 5, 23, 130, 688 }, // ∉
{ 19, 16, 29, 5, 18, 76, 818 }, // ∊
{ 19, 21, 29, 5, 21, 100, 894 }, // ∋
{ 19, 26, 29, 5, 23, 124, 994 }, // ∌
{ 19, 16, 29, 5, 18, 76, 1118 }, // ∍
{ 22, 26, 24, 1, 21, 143, 1194 }, // ∏
{ 18, 26, 18, 0, 21, 117, 1337 }, // ∑
{ 13, 3, 18, 3, 11, 10, 1454 }, //
{ 13, 23, 14, 1, 21, 75, 1464 }, //
{ 13, 23, 15, 2, 21, 75, 1539 }, //
{ 14, 14, 18, 2, 17, 49, 1614 }, //
{ 10, 9, 18, 4, 14, 23, 1663 }, // ∘
{ 5, 4, 18, 7, 10, 5, 1686 }, // ∙
{ 18, 28, 18, 0, 24, 126, 1691 }, // √
{ 14, 11, 18, 2, 15, 39, 1817 }, // ∝
{ 19, 10, 18, 0, 14, 48, 1856 }, // ∞
{ 18, 21, 29, 5, 21, 95, 1904 }, // ∟
{ 21, 21, 29, 3, 21, 111, 1999 }, // ∠
{ 3, 30, 15, 6, 23, 23, 2110 }, //
{ 8, 30, 15, 3, 23, 60, 2133 }, // ∥
{ 19, 21, 29, 5, 21, 100, 2193 }, // ∧
{ 19, 21, 29, 5, 21, 100, 2293 }, //
{ 17, 22, 29, 6, 21, 94, 2393 }, // ∩
{ 17, 22, 29, 6, 21, 94, 2487 }, //
{ 15, 30, 18, 2, 23, 113, 2581 }, // ∫
{ 19, 15, 29, 5, 15, 72, 2694 }, // ∴
{ 19, 15, 29, 5, 15, 72, 2766 }, // ∵
{ 5, 15, 9, 2, 17, 19, 2838 }, //
{ 19, 15, 29, 5, 15, 72, 2857 }, // ∷
{ 17, 6, 29, 6, 11, 26, 2929 }, //
{ 17, 15, 29, 6, 18, 64, 2955 }, // ≅
{ 14, 10, 18, 2, 15, 35, 3019 }, // ≈
{ 17, 11, 29, 6, 14, 47, 3054 }, // ≍
{ 13, 13, 18, 3, 16, 43, 3101 }, // ≠
{ 17, 12, 29, 6, 15, 51, 3144 }, // ≡
{ 14, 18, 18, 2, 18, 63, 3195 }, // ≤
{ 14, 18, 18, 2, 18, 63, 3258 }, // ≥
{ 23, 14, 29, 3, 17, 81, 3321 }, // ≪
{ 23, 14, 29, 3, 17, 81, 3402 }, // ≫
{ 19, 16, 29, 5, 18, 76, 3483 }, // ⊃
{ 19, 26, 29, 5, 23, 124, 3559 }, // ⊄
{ 19, 26, 29, 5, 23, 124, 3683 }, // ⊅
{ 19, 21, 29, 5, 21, 100, 3807 }, // ⊆
{ 19, 21, 29, 5, 21, 100, 3907 }, // ⊇
{ 22, 22, 29, 4, 21, 121, 4007 }, // ⊕
{ 22, 22, 29, 4, 21, 121, 4128 }, // ⊖
{ 21, 22, 29, 4, 21, 116, 4249 }, // ⊗
{ 21, 22, 29, 4, 21, 116, 4365 }, // ⊘
{ 17, 21, 29, 6, 21, 90, 4481 }, // ⊥
{ 5, 4, 18, 7, 10, 5, 4571 }, // ⋅
{ 25, 4, 29, 2, 10, 25, 4576 }, // ⋯
{ 28, 28, 29, 1, 25, 196, 0 }, // <20>
};
static const EpdUnicodeInterval bookerly_14_regularIntervals[] = {
{ 0x0, 0x0, 0x0 },
{ 0x8, 0x9, 0x1 },
{ 0xD, 0xD, 0x3 },
{ 0x1D, 0x1D, 0x4 },
{ 0x20, 0x7E, 0x5 },
{ 0xA0, 0xFF, 0x64 },
{ 0x100, 0x17F, 0xC4 },
{ 0x300, 0x304, 0x144 },
{ 0x306, 0x30C, 0x149 },
{ 0x30F, 0x30F, 0x150 },
{ 0x311, 0x315, 0x151 },
{ 0x31B, 0x31B, 0x156 },
{ 0x323, 0x329, 0x157 },
{ 0x32D, 0x32E, 0x15E },
{ 0x330, 0x331, 0x160 },
{ 0x342, 0x342, 0x162 },
{ 0x344, 0x345, 0x163 },
{ 0x400, 0x45F, 0x165 },
{ 0x462, 0x463, 0x1C5 },
{ 0x472, 0x475, 0x1C7 },
{ 0x48A, 0x4FF, 0x1CB },
{ 0x2000, 0x2030, 0x241 },
{ 0x2032, 0x203C, 0x272 },
{ 0x203E, 0x203E, 0x27D },
{ 0x2043, 0x2044, 0x27E },
{ 0x2047, 0x2049, 0x280 },
{ 0x2053, 0x2053, 0x283 },
{ 0x2057, 0x2057, 0x284 },
{ 0x205F, 0x2064, 0x285 },
{ 0x2070, 0x2070, 0x28B },
{ 0x2074, 0x2079, 0x28C },
{ 0x207F, 0x2089, 0x292 },
{ 0x20A3, 0x20A4, 0x29D },
{ 0x20A7, 0x20A7, 0x29F },
{ 0x20AC, 0x20AC, 0x2A0 },
{ 0x2190, 0x2195, 0x2A1 },
{ 0x21A8, 0x21A8, 0x2A7 },
{ 0x21B2, 0x21B3, 0x2A8 },
{ 0x21B5, 0x21B5, 0x2AA },
{ 0x21D0, 0x21D4, 0x2AB },
{ 0x2200, 0x2200, 0x2B0 },
{ 0x2202, 0x2203, 0x2B1 },
{ 0x2205, 0x220D, 0x2B3 },
{ 0x220F, 0x220F, 0x2BC },
{ 0x2211, 0x2212, 0x2BD },
{ 0x2215, 0x221A, 0x2BF },
{ 0x221D, 0x2220, 0x2C5 },
{ 0x2223, 0x2223, 0x2C9 },
{ 0x2225, 0x2225, 0x2CA },
{ 0x2227, 0x222B, 0x2CB },
{ 0x2234, 0x2237, 0x2D0 },
{ 0x223C, 0x223C, 0x2D4 },
{ 0x2245, 0x2245, 0x2D5 },
{ 0x2248, 0x2248, 0x2D6 },
{ 0x224D, 0x224D, 0x2D7 },
{ 0x2260, 0x2261, 0x2D8 },
{ 0x2264, 0x2265, 0x2DA },
{ 0x226A, 0x226B, 0x2DC },
{ 0x2283, 0x2287, 0x2DE },
{ 0x2295, 0x2298, 0x2E3 },
{ 0x22A5, 0x22A5, 0x2E7 },
{ 0x22C5, 0x22C5, 0x2E8 },
{ 0x22EF, 0x22EF, 0x2E9 },
{ 0xFFFD, 0xFFFD, 0x2EA },
};
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
static const EpdFontGroup bookerly_14_regularGroups[] = {
fix: force auto-hinting for Bookerly to fix inconsistent stem widths (#1098) ## Summary Bookerly's native TrueType hinting is effectively a no-op at the sizes used here, causing FreeType to place stems at inconsistent sub-pixel positions. This results in the 'k' stem (8-bit fringe: 0x38=56) falling just below the 2-bit quantization threshold while 'l' and 'h' stems (fringes: 0x4C=76, 0x40=64) land above it --- making 'k' visibly narrower (2.00px vs 2.33px effective width). FreeType's auto-hinter snaps all stems to consistent grid positions, normalizing effective stem width to 2.67px across all glyphs. Adds --force-autohint flag to fontconvert.py and applies it to Bookerly only. NotoSans, OpenDyslexic, and Ubuntu fonts are unaffected. Here is an example of before/after. Take notice of the vertical stems on characters like `l`, `k`, `n`, `i`, etc. The font is Bookerly 12pt regular: **BEFORE**: ![before](https://github.com/user-attachments/assets/65b2acab-ad95-489e-885e-e3a0163cc252) **AFTER**: ![after](https://github.com/user-attachments/assets/d09a8b5d-40af-4a7d-b622-e1b2cabcce85) Claude generated this script to quantitatively determine that this change makes the vertical stems on a variety of characters more consistent for Bookerly _only_. <details> <summary>Python script</summary> ```python #!/usr/bin/env python3 """Compare stem consistency across all font families with and without auto-hinting. Run from repo root: python3 compare_all_fonts.py """ import freetype DPI = 150 CHARS = ["k", "l", "h", "i", "b", "d"] SIZES = [12, 14, 16, 18] FONTS = { "Bookerly": "lib/EpdFont/builtinFonts/source/Bookerly/Bookerly-Regular.ttf", "NotoSans": "lib/EpdFont/builtinFonts/source/NotoSans/NotoSans-Regular.ttf", "OpenDyslexic": "lib/EpdFont/builtinFonts/source/OpenDyslexic/OpenDyslexic-Regular.otf", "Ubuntu": "lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Regular.ttf", } MODES = { "default": freetype.FT_LOAD_RENDER, "autohint": freetype.FT_LOAD_RENDER | freetype.FT_LOAD_FORCE_AUTOHINT, } def q4to2(v): if v >= 12: return 3 elif v >= 8: return 2 elif v >= 4: return 1 else: return 0 def get_stem_eff(face, char, flags): gi = face.get_char_index(ord(char)) if gi == 0: return None face.load_glyph(gi, flags) bm = face.glyph.bitmap w, h = bm.width, bm.rows if w == 0 or h == 0: return None p2 = [] for y in range(h): row = [] for x in range(w): row.append(q4to2(bm.buffer[y * bm.pitch + x] >> 4)) p2.append(row) # Measure leftmost stem in stable middle rows mid_start, mid_end = h // 4, h - h // 4 widths = [] for y in range(mid_start, mid_end): first = next((x for x in range(w) if p2[y][x] > 0), -1) if first < 0: continue last = first for x in range(first, w): if p2[y][x] > 0: last = x else: break eff = sum(p2[y][x] for x in range(first, last + 1)) / 3.0 widths.append(eff) return round(sum(widths) / len(widths), 2) if widths else None def main(): for font_name, font_path in FONTS.items(): try: freetype.Face(font_path) except Exception: print(f"\n {font_name}: SKIPPED (file not found)") continue print(f"\n{'=' * 80}") print(f" {font_name}") print(f"{'=' * 80}") for size in SIZES: print(f"\n {size}pt:") print(f" {'':6s}", end="") for c in CHARS: print(f" '{c}' ", end="") print(" | spread") for mode_name, flags in MODES.items(): face = freetype.Face(font_path) face.set_char_size(size << 6, size << 6, DPI, DPI) vals = [] print(f" {mode_name:6s}", end="") for c in CHARS: v = get_stem_eff(face, c, flags) vals.append(v) print(f" {v:5.2f}" if v else " N/A", end="") valid = [v for v in vals if v is not None] spread = max(valid) - min(valid) if len(valid) >= 2 else 0 marker = " <-- inconsistent" if spread > 0.5 else "" print(f" | {spread:.2f}{marker}") if __name__ == "__main__": main() ``` </details> Here are the results. The table compares how the font-generation `autohint` flag affects the range of widths of various characters. Lower `spread` mean that glyph stroke widths should appear more consistent. ``` Spread = max stem width - min stem width across glyphs (lower = more consistent): ┌──────────────┬──────┬─────────┬──────────┬──────────┐ │ Font │ Size │ Default │ Autohint │ Winner │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Bookerly │ 12pt │ 1.49 │ 1.12 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.39 │ 1.13 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.38 │ 1.16 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.90 │ 1.58 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ NotoSans │ 12pt │ 1.16 │ 0.94 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 0.83 │ 1.14 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 1.41 │ 1.51 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.74 │ 1.63 │ mixed │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ OpenDyslexic │ 12pt │ 2.22 │ 1.44 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 2.57 │ 3.29 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 3.13 │ 2.60 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 3.21 │ 3.23 │ ~tied │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ Ubuntu │ 12pt │ 1.25 │ 1.31 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 14pt │ 1.41 │ 1.64 │ default │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 16pt │ 2.21 │ 1.71 │ autohint │ ├──────────────┼──────┼─────────┼──────────┼──────────┤ │ │ 18pt │ 1.80 │ 1.71 │ autohint │ └──────────────┴──────┴─────────┴──────────┴──────────┘ ``` --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? I used AI to make sure I'm not doing something stupid, since I'm not a typography expert. I made the changes though.
2026-02-24 06:13:08 +11:00
{ 0, 3672, 7080, 100, 0 },
{ 3672, 3715, 8974, 96, 100 },
{ 7387, 5108, 14197, 128, 196 },
{ 12495, 313, 406, 33, 324 },
{ 12808, 9171, 23402, 220, 357 },
{ 21979, 1158, 2265, 74, 577 },
{ 23137, 308, 611, 18, 651 },
{ 23445, 299, 442, 4, 669 },
{ 23744, 413, 888, 15, 673 },
{ 24157, 2146, 4601, 58, 688 },
{ 26303, 133, 196, 1, 746 },
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
};
static const EpdFontData bookerly_14_regular = {
bookerly_14_regularBitmaps,
bookerly_14_regularGlyphs,
bookerly_14_regularIntervals,
64,
38,
31,
-8,
true,
perf: Reduce overall flash usage by 30.7% by compressing built-in fonts (#831) ## Summary **What is the goal of this PR?** Compress reader font bitmaps to reduce flash usage by 30.7%. **What changes are included?** - New `EpdFontGroup` struct and extended `EpdFontData` with `groups`/`groupCount` fields - `--compress` flag in `fontconvert.py`: groups glyphs (ASCII base group + groups of 8) and compresses each with raw DEFLATE - `FontDecompressor` class with 4-slot LRU cache for on-demand decompression during rendering - `GfxRenderer` transparently routes bitmap access through `getGlyphBitmap()` (compressed or direct flash) - Uses `uzlib` for decompression with minimal heap overhead. - 48 reader fonts (Bookerly, NotoSans 12-18pt, OpenDyslexic) regenerated with compression; 5 UI fonts unchanged - Round-trip verification script (`verify_compression.py`) runs as part of font generation ## Additional Context ## Flash & RAM | | baseline | font-compression | Difference | |--|--------|-----------------|------------| | Flash (ELF) | 6,302,476 B (96.2%) | 4,365,022 B (66.6%) | -1,937,454 B (-30.7%) | | firmware.bin | 6,468,192 B | 4,531,008 B | -1,937,184 B (-29.9%) | | RAM | 101,700 B (31.0%) | 103,076 B (31.5%) | +1,376 B (+0.5%) | ## Script-Based Grouping (Cold Cache) Comparison of uncompressed baseline vs script-based group compression (4-slot LRU cache, cleared each page). Glyphs are grouped by Unicode block (ASCII, Latin-1, Latin Extended-A, Combining Marks, Cyrillic, General Punctuation, etc.) instead of sequential groups of 8. ### Render Time | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Median** | 414.9 ms | 431.6 ms | +16.7 ms (+4.0%) | | **Pages** | 37 | 37 | | ### Memory Usage | | Baseline | Compressed (cold cache) | Difference | |---|---|---|---| | **Heap free (median)** | 187.0 KB | 176.3 KB | -10.7 KB | | **Heap free (min)** | 186.0 KB | 166.5 KB | -19.5 KB | | **Largest block (median)** | 148.0 KB | 128.0 KB | -20.0 KB | | **Largest block (min)** | 148.0 KB | 120.0 KB | -28.0 KB | ### Cache Effectiveness | | Misses/page | Hit rate | |---|---|---| | **Compressed (cold cache)** | 2.1 | 99.85% | ------ ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ Implementation was done by Claude Code (Opus 4.6) based on a plan developed collaboratively. All generated font headers were verified with an automated round-trip decompression test. The firmware was compiled successfully but has not yet been tested on-device. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:30:15 +11:00
bookerly_14_regularGroups,
11,
};