/* Simple program to take PGM input and use aalib to render it to ascii. * Uses netpbm and aalib 1.2 (http://www.ta.jcu.cz/aa) * Author: Nelson Minar Mon Apr 26 19:59:59 EDT 1999 * http://www.media.mit.edu/~nelson/ */ #include #include #include #include void writeImage(void); void readImage(void); void init_aa_defs(int mode); void init_postscript_format(); struct aa_savedata savedata; int imgheight, imgwidth; gray ** image; gray maxGray; struct aa_font fontpostscript; struct aa_format postscript_format; char fontsize[256], leading[256]; int main(int argc, char ** argv) { /* First, read the PGM data in and check it out. */ pgm_init(&argc, argv); readImage(); /* Now, intialize aalib (bummer - command line parsing happens now.) */ if (getenv("AAMODE")) init_aa_defs(atoi(getenv("AAMODE"))); else init_aa_defs(1); aa_parseoptions(NULL, NULL, &argc, argv); if (argc != 1) { fprintf(stderr, "%s\n", aa_help); exit(1); } /** And save out the image in the requested format. */ writeImage(); /** Finally, write out a documentation string and show the page. **/ { int o = aa_defparams.supported; char options[256]; sprintf(options, "options: %s%s%s%s%s", (o&AA_NORMAL_MASK) ? "normal " : "", (o&AA_DIM_MASK) ? "dim " : "", (o&AA_BOLD_MASK) ? "bold " : "", (o&AA_BOLDFONT_MASK) ? "boldfont " : "", (o&AA_REVERSE_MASK) ? "reverse " : ""); printf("/Times-Roman findfont 12 scalefont setfont\n" "24 760 moveto (%dx%d image Courier %s/%s %s) show\n", imgwidth, imgheight, fontsize, leading, options); printf("showpage\n"); } return 0; } void readImage(void) { image = pgm_readpgm(stdin, &imgwidth, &imgheight, &maxGray); fprintf(stderr, "Read %dx%d max %d\n", imgwidth, imgheight, maxGray); if (maxGray != 255) fprintf(stderr, "Warning: maxGray not 255, unpredictable results."); } /* Save the image array to an AALib formatted file */ void writeImage(void) { aa_context * context; int x, y; /* First, initialize aalib with the save-file driver. */ context = aa_init(&save_d, &aa_defparams, &savedata); if (context == NULL) { fprintf(stderr, "aa_init() returned null!"); exit(1); } /* Now set up the font to what we were asked to. */ aa_setfont(context, aa_defparams.font); /* Paint the image data into the aalib buffers. Invert white/black as we go. */ for (y = 0; y < imgheight; y++) for (x = 0; x < imgwidth; x++) aa_putpixel(context, x, y, maxGray - image[y][x]); /* Tell aalib to render and output the data. **/ aa_render(context, &aa_defrenderparams, 0, 0, aa_scrwidth(context), aa_scrheight(context)); aa_flush(context); aa_close(context); } /* Initialize aalib parameters as requested * Mode is either 0 (text) or 1 (postscript) */ void init_aa_defs(int mode) { /* Calculate the font height. The page is 600 pts wide (roughly), * and Courier has 2:3 aspect ratio. Two pixels make 1 character */ double fontWidth = 600.0 / (imgwidth / 2); double fontHeight = fontWidth * 3 / 2; sprintf(fontsize, "%.2f", fontHeight); sprintf(leading, "%.2f", fontHeight * 0.9); fprintf(stderr, "Using a font height of %spt, leading of %spt\n", fontsize, leading); init_postscript_format(); savedata.name = NULL; savedata.file = stdout; if (mode == 0) { savedata.format = &aa_text_format; aa_defparams.font = &aa_fontcourier; /* just a guess */ } else { savedata.format = &postscript_format; aa_defparams.font = savedata.format->font; } aa_defparams.supported = savedata.format->supported; /* Set the output size to be the same as the input. (Actually, 1/2:, * the aalib output sizes are 1/2 image input (2x2 pixels -> 1 char) */ aa_defparams.width = (imgwidth+1)/2; aa_defparams.height = (imgheight+1)/2; /* Initialize these just in case. */ aa_defparams.minwidth = 0; aa_defparams.minheight = 0; aa_defparams.maxwidth = 0; aa_defparams.maxheight = 0; aa_defparams.recwidth = 0; aa_defparams.recheight = 0; } static char * postscript_escapes[] = {"(", "\\(", ")", "\\)", "\\", "\\\\", NULL}; /* Basic plan for postscript: * 5 700 % starting x/y coordinate * P % position for a new line of text * (foo) % print string "foo") * S % show the string, and update the y coordinate */ /* The font size to use and the leading between lines */ /* Def to position text at the spot marked on the stack */ #define POSDEF "/P { dup 2 index exch moveto } bind def" /* Def to show a string at normal width. */ #define NORMALCHAR "/N { show } bind def" /* Def to show a string, but make it brighter by putting a bit of stroke * around it. Only tested with Courier3 on an HP Laserjet */ /* Methods to make characters brighter. */ char brightChar[] = " % charpath + show: /B { dup gsave false charpath 0.05 setlinewidth stroke grestore show } bind def % overstrike: % /B { dup gsave -0.04 0 rmoveto show grestore 0.04 0 rmoveto show -0.04 0 rmoveto } bind def % bold font: % /B { show /Courier findfont 15.00 scalefont setfont } bind def % bold font: % /BB { /Courier-Bold findfont 15.00 scalefont setfont } bind def % normal: /BB { } bind def "; char dimChar[] = " % charpath alone: % /D { dup gsave false charpath 0.05 setlinewidth stroke grestore stringwidth rmoveto } bind def % charpath - show % /D { dup dup gsave gsave false charpath 0.05 setlinewidth stroke 0 setgray grestore 1 setgray show 0 setgray grestore stringwidth rmoveto } bind def % show - charpath /D { dup dup gsave gsave show grestore 1 setgray false charpath 0.05 setlinewidth stroke 0 setgray grestore stringwidth rmoveto } bind def % light gray fill % /D { 0.75 setgray show 0 setgray } bind def "; /** Footer - should probably have a showpage in it too, but main() is ** writing more postscript after this is done. and does the showpage then. **/ static char * postscriptFooter = "S\n pop pop\n"; static char * postscriptNewline = " S\nP "; struct aa_format postscript_format = { 0, 0, /* width, height */ 0, 0, /* pagewidth, pageheight */ 0, /* flags */ AA_NORMAL_MASK | AA_DIM_MASK | AA_BOLD_MASK, /* supported modes */ &fontpostscript, /* font structure */ "Postscript file", /* string name */ ".ps", /* file extension */ NULL, /* header, filled later */ NULL, /* footer, filled later */ NULL, /* newline, filled later */ { "%s", "%s", "%s", "%s", "%s", }, /* prints */ {"(", /* beginning chars */ "(", /* dim */ "BB (", /* bright */ "", /* bold */ "^V" /* reverse */ }, {")N ", /* ending charcaters */ ")D ", /* dim */ ")B ", /* bright */ "", /* bold */ "^V" /* reverse */ }, postscript_escapes /* escapes */ }; void init_postscript_format() { char skipdef[256], fontdef[256], header[4096]; /** A macro to subtract a constant from the top of the stack ** used to do leading. **/ sprintf(skipdef, "/S { %s sub } bind def", leading); /** The definition of the font we use. **/ sprintf(fontdef, "/Courier findfont %s scalefont setfont", fontsize); sprintf(header, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", "%!PS-Adobe-3.0", POSDEF, skipdef, NORMALCHAR, brightChar, dimChar, fontdef, "\n24 720\n\nP "); postscript_format.head = (char *)strdup(header); postscript_format.end = postscriptFooter; postscript_format.newline = postscriptNewline; } #include "fontcourierdata.h" struct aa_font fontpostscript = {fontcourierdata, 12, "Adobe courier", "courier"}; static unsigned char origfontcourierdata[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x7e, 0x24, 0x24, 0x7e, 0x28, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x3c, 0x54, 0x74, 0x18, 0x56, 0x52, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x70, 0x90, 0x90, 0x7e, 0x70, 0x0e, 0x12, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x20, 0x20, 0x36, 0x4c, 0x48, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x00, 0x00, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7c, 0x10, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x7e, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00, 0x00, 0x38, 0x24, 0x42, 0x42, 0x42, 0x42, 0x24, 0x38, 0x00, 0x00, 0x00, 0x00, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x04, 0x04, 0x08, 0x10, 0x24, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x38, 0x04, 0x04, 0x18, 0x04, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x18, 0x28, 0x28, 0x7c, 0x08, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x40, 0x40, 0x78, 0x04, 0x04, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20, 0x20, 0x78, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x38, 0x24, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x3c, 0x04, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x20, 0x30, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x18, 0x04, 0x0c, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x04, 0x04, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x9d, 0xa9, 0xab, 0x5e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x24, 0x24, 0x7e, 0x42, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x7c, 0x42, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x40, 0x40, 0x40, 0x21, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x42, 0x42, 0x42, 0x42, 0x42, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x22, 0x28, 0x38, 0x20, 0x22, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x22, 0x24, 0x3c, 0x20, 0x20, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x80, 0x80, 0x8f, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x04, 0x04, 0x44, 0x44, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x24, 0x28, 0x38, 0x28, 0x24, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x20, 0x20, 0x22, 0x22, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x66, 0x66, 0x5a, 0x52, 0x42, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x62, 0x52, 0x4a, 0x4a, 0x46, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x82, 0x82, 0x82, 0x44, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x22, 0x22, 0x3c, 0x20, 0x20, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x82, 0x82, 0x82, 0x46, 0x3c, 0x10, 0x2e, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x46, 0x78, 0x4c, 0x44, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x42, 0x60, 0x1c, 0x02, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x92, 0x92, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x22, 0x24, 0x24, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x4a, 0x5a, 0x5a, 0x5a, 0x6a, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x64, 0x18, 0x18, 0x24, 0x46, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x46, 0x2c, 0x38, 0x10, 0x10, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x44, 0x08, 0x10, 0x22, 0x22, 0x7e, 0x00, 0x00, 0x00, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x00, 0x00, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x24, 0x64, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x44, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x5c, 0x64, 0x42, 0x42, 0x62, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x62, 0x40, 0x40, 0x43, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x3a, 0x46, 0x42, 0x42, 0x46, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x26, 0x42, 0x7e, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x44, 0x84, 0x84, 0x44, 0x3c, 0x04, 0x38, 0x00, 0x00, 0xc0, 0x40, 0x5c, 0x62, 0x42, 0x42, 0x42, 0xe6, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, 0x00, 0x60, 0x20, 0x2e, 0x28, 0x30, 0x28, 0x28, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x92, 0x92, 0x92, 0x92, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x64, 0x44, 0x44, 0x44, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x42, 0x42, 0x62, 0x5c, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x46, 0x42, 0x42, 0x46, 0x3a, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x30, 0x20, 0x20, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x46, 0x60, 0x5e, 0x62, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x44, 0x44, 0x44, 0x44, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x42, 0x24, 0x24, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x4a, 0x5a, 0x5a, 0x5a, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x64, 0x18, 0x18, 0x64, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x24, 0x24, 0x14, 0x18, 0x10, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x44, 0x08, 0x10, 0x22, 0x7e, 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x10, 0x08, 0x08, 0x08, 0x0c, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x10, 0x10, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x3e, 0x52, 0x50, 0x77, 0x38, 0x10, 0x10, 0x00, 0x00, 0x00, 0x1e, 0x22, 0x20, 0x7c, 0x10, 0x10, 0x20, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x7c, 0x44, 0x44, 0x64, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x46, 0x2c, 0x18, 0x3e, 0x3e, 0x10, 0x3c, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x3c, 0x20, 0x78, 0x44, 0x32, 0x0e, 0x24, 0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x5a, 0xa5, 0xa1, 0xa5, 0x5a, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x28, 0x3c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x48, 0x24, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0xa5, 0xb9, 0xb5, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7e, 0x10, 0x10, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x08, 0x10, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x18, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x44, 0x44, 0x44, 0x44, 0x7e, 0x40, 0x40, 0x00, 0x00, 0x00, 0x7c, 0x54, 0x54, 0x34, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x18, 0x00, 0x00, 0x30, 0x10, 0x10, 0x10, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x24, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x24, 0x12, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x42, 0x44, 0x44, 0xea, 0x16, 0x26, 0x4f, 0x43, 0x00, 0x00, 0x00, 0xc3, 0x42, 0x44, 0x4c, 0xfe, 0x11, 0x23, 0x42, 0x47, 0x00, 0x00, 0x00, 0xe1, 0x22, 0x64, 0x14, 0xea, 0x16, 0x26, 0x2f, 0x43, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x18, 0x20, 0x40, 0x44, 0x3c, 0x00, 0x08, 0x00, 0x78, 0x18, 0x24, 0x24, 0x7e, 0x42, 0xe7, 0x00, 0x00, 0x00, 0x08, 0x00, 0x78, 0x18, 0x24, 0x24, 0x7e, 0x42, 0xe7, 0x00, 0x00, 0x10, 0x28, 0x00, 0x78, 0x18, 0x24, 0x24, 0x7e, 0x42, 0xe7, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x78, 0x18, 0x24, 0x24, 0x7e, 0x42, 0xe7, 0x00, 0x00, 0x18, 0x00, 0x00, 0x78, 0x18, 0x24, 0x24, 0x7e, 0x42, 0xe7, 0x00, 0x00, 0x18, 0x18, 0x00, 0x78, 0x18, 0x24, 0x24, 0x7e, 0x42, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x2c, 0x2c, 0x7c, 0x4a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x22, 0x40, 0x40, 0x40, 0x21, 0x3e, 0x0c, 0x1c, 0x00, 0x08, 0x00, 0x7e, 0x22, 0x28, 0x38, 0x20, 0x22, 0x7e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7e, 0x22, 0x28, 0x38, 0x20, 0x22, 0x7e, 0x00, 0x00, 0x10, 0x28, 0x00, 0x7e, 0x22, 0x28, 0x38, 0x20, 0x22, 0x7e, 0x00, 0x00, 0x18, 0x00, 0x00, 0x7e, 0x22, 0x28, 0x38, 0x20, 0x22, 0x7e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x10, 0x28, 0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x42, 0x42, 0xf2, 0x42, 0x42, 0xfc, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xe7, 0x62, 0x52, 0x4a, 0x4a, 0x46, 0xe6, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3c, 0x42, 0x82, 0x82, 0x82, 0x44, 0x3c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3c, 0x42, 0x82, 0x82, 0x82, 0x44, 0x3c, 0x00, 0x00, 0x10, 0x28, 0x00, 0x3c, 0x42, 0x82, 0x82, 0x82, 0x44, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x42, 0x82, 0x82, 0x82, 0x44, 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3c, 0x42, 0x82, 0x82, 0x82, 0x44, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x38, 0x38, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x46, 0x8a, 0x92, 0x92, 0x64, 0x7c, 0x00, 0x00, 0x00, 0x08, 0x00, 0xe6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x08, 0x00, 0xe6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x10, 0x28, 0x00, 0xe6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x18, 0x00, 0x00, 0xe6, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x08, 0x00, 0xe7, 0x46, 0x2c, 0x38, 0x10, 0x10, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x3c, 0x22, 0x22, 0x22, 0x3c, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x38, 0x26, 0x22, 0x22, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x44, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x44, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x44, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x44, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x44, 0x7e, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x38, 0x04, 0x3c, 0x44, 0x44, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x12, 0x72, 0x9e, 0x90, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x40, 0x40, 0x43, 0x3c, 0x10, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x26, 0x42, 0x7e, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x26, 0x42, 0x7e, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1c, 0x26, 0x42, 0x7e, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x1c, 0x26, 0x42, 0x7e, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00, 0x00, 0x00, 0x70, 0x18, 0x24, 0x3e, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x64, 0x44, 0x44, 0x44, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3c, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3c, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3c, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3c, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7e, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x46, 0x4a, 0x52, 0x62, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xcc, 0x44, 0x44, 0x44, 0x44, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xcc, 0x44, 0x44, 0x44, 0x44, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xcc, 0x44, 0x44, 0x44, 0x44, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xcc, 0x44, 0x44, 0x44, 0x44, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x66, 0x24, 0x24, 0x14, 0x18, 0x10, 0x10, 0x70, 0x00, 0x00, 0xc0, 0x40, 0x5c, 0x66, 0x42, 0x42, 0x62, 0x5c, 0x40, 0xf0, 0x00, 0x00, 0x18, 0x00, 0x66, 0x24, 0x24, 0x14, 0x18, 0x10, 0x10, 0x70, 0x00, 0x00,};